Add a draft of the new query syntax.
Add negation to query language.
"called-by" is much easier to think about than "callee", even if it is longer.
Require parsimonious.
Take a first whack at a basic query grammar implementation.

To come: quotes, ability to match text with more than just the enumerated chars, real tests.
Fix inability to identify a lone hyphen as a free text term.
Iron out quoted-string regexes, allowing for a lot of do-what-I-mean while typing.
Quiet the smoke tests.
Change query design docs to indicate that \\" (not \\\") is backslash-quote.
Fully implement query visitor, come up with new query intermediate format, and sketch new query engine that understands it.

* Dynamically get filter names from the filter registry rather than coding them in redundantly.
* Support per-term case sensitivity (which we can expose to the user in the future).
* New query language is superior in the following ways (not comprehensive):
  * Filters accept quoted phrases as args.
  * Quoting chars are no longer required around regexes.
  * Literal quotation marks can now be expressed.
  * Single quotes are available as an alternative to double quotes for phrases.
* Arbitrary quoting chars around regexes are no longer allowed; use single or double quotes or bare text.
* Invent a new intermediate format between the parser and the query apparatus. The old attributes on Query go away, replaced with a unified `Query.terms` that is a nested dict with a format driven by ease of use by the query machinery. Sketch out new query machinery to match. The latter is in a "should-work" state, but I haven't tested it. The new intermediate format unifies a lot of things (like phrases and "keywords") that were separated for no reason I can see. As a result, some things get simpler; look how much shorter single_term() got.
* Implement query visitor and tests for it all. Iron out several kinks in the grammar.

Why-did-I-do-that notes:
* SearchFilter.params is no longer a list of permutations of filter names and prefixes; we don't need that junk anymore, thanks to the parser. Now it's used for the odd case of when a filter handles multiple filter names (just the trilite filter, for now).
* Move the grammar stuff to the end so it can depend on the filter list.
* Graduate smoke tests into real, comparing ones.
Turn some "make sure this works" comments into tests (and delete some that already were).
Integration-test unclosed and quoted quotes.
Support unicode in the query grammar.
Rewrite extents() methods to work with the new internal query format. Debug filter() methods. All tests now pass.

* It turns out that every filter gets its extents() method called, which means the kwarg unpacking doesn't work out. Switch to passing in a normal hash.
* Redo extents() args so it takes only what it needs.
Fix parse error when query is utterly empty, and work around trilite hang when an extent-query arg is empty.

Also remove some comments that don't make sense to anyone but me and that will probably fall out of date.
Rename test_query, as it turned out to be tests for the parser only, not for any filters.
Move queries.rst, which doesn't reflect the present state of things, to the wiki, at https://wiki.mozilla.org/DXR_Query_Language_Refresh.
Implement a new query parser, bringing better brevity, the ability to express the previously inexpressible, and many technical improvements.

* Parser is now a real parser, with all the formal error resistance that brings. Filters and intermediate data structures have been redesigned to match.
* New query language (not comprehensive)...
  * Accepts quoted phrases as filter args.
  * No longer requires quoting chars around regexes.
  * Can express literal quotation marks.
  * Allows single quotes as an alternative to double quotes, when that's more convenient.
* Arbitrary quoting chars around regexes are no longer allowed; use single or double quotes or bare text.
* Dynamically get filter names from the filter registry rather than coding them in redundantly.
* Support per-term case sensitivity (which we can expose to the user in the future).