standard library, search path

refactor fs and notify into single interface

no trailing newline in parser test, requires changes to expr stmt

parse tree/ast testing? - expected AST as result from parse/check instead of
    merely getting a result

mapping between progs and logs to reduce wasted processing

bytecode like
[{push 1} {push 0} {cmp 1} {jm 6} {push 0} {jmp 7} {push 1} {jnm 13}
    {setmatched false} {mload 0} {dload 0} {inc <nil>} {setmatched true}]
can be expressed as
[{push 1} {push 0} {cmp 1} {jm 9} {setmatched false} {mload 0} {dload 0} {inc
    <nil>} {setmatched true}]
but jnm 13 is from the condExpr and the previous is from a comparison binary
    expr; an optimizer is needed to collapse the bytecode to undersand that
    cmp, jm, push, jump, push, jnm in sequence like so is the same as a cmp, jm
and we need to worry about the jump table too


count stack size and preallocate stack
-> counts of push/pop per instruction
-> test to keep p/p counts updated


Run and upload benchmarks to https://perfdata.golang.org/ from circleci

openLogPath's seenBefore in the tailer's handle* is incorrect because by
    definition every file path that's new here shold be read from the start of
    the file. Only files read at mtail startup should seek to EOF.  Otherwise
    we miss the first lines of the file.  This is causing unnecessary
    complexity in the tailer code.

GC in the tailer to remove handles on files that haven't been updated in 24h,
    when log files rotate with a timestamp-like pattern


Add coverage from regtest
- perhaps with https://blog.cloudflare.com/go-coverage-with-external-tests/
- or just a flag to mtail?

# Won't do

X Use capture group references to feed back to declaring regular expression,
X     noting unused caprefs,
X     possibly flipping back to noncapturing (and renumbering the caprefs?)
        X -> unlikely to implement, probably won't impact regexp speed
