Allow grouping in querying

This overhauls the querying module to allow for grouping and fixes bugs where some OR querys were being treated as AND queries.  Note that this changes the structure of the `Query` object itself.  Instead of being an iterable containing many `QuerySegment`s on an equal level, it is now a tree style structure that includes `BinaryQuerySegment`s to link queries together.  This could actually use a bit more work in the code organization and cleanup department, but all the features are implemented!

`a=b&(b=c;c=d)&!(e=f;g=h)` works!  :tada: