Keep CQL box in sync with the page

This builds on PR #295—I'll rebase once that's merged.

This adds two new methods to `QueryLanguage`:

  - `toString`: converts a JSON query to a CQL query string
  - `isEquivalent`: determines if two JSON queries are equivalent

I use those in `QueryBox` to set the value in the CQL box when the page state changes, taking care not to disrupt the user while they're typing, or to override something the user typed with an equivalent machine-generated query.

This also adds a dpxdt test for filtering.

Fixes #236 
Fixes #260 
Fixes #262 
Fixes #301 
What doesn't this fix!?

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/hammerlab/cycledash/306)
<!-- Reviewable:end -->

Interesting, I misunderstood the OO mode. I thought `_(x).underscoreMethod1().underscoreMethod2()` would work, but you need an explicit `_.chain` to get that. The form I used only works for one operation, since it returns a real list, not a wrapped one.

I do like the idea of using `_.chain` for 3+ nested calls. Beyond just being left→right, it's a big win that your method names and parameters stay close together (e.g. `groupBy` and the function you're grouping by) rather than getting arbitrarily far apart.