Reimplement queries

* add support for Q and combining Qs
* add support for explicit should, must and must_not clause specification
* add and update tests
* add and update documentation

There are a few things that still need to be done:

1. rewrite a bunch of the query documentation
2. add Q to the docs
3. go through the whole thing and double-check everything

feedback?

Does this look like a good approach? If you look at the new tests, does that usage look sane?