Decompose & coalesce MapReduceOps.

`MapReduceOp` has been replaced by `MapOp`, `FlatMapOp` and `ReduceOp`,
which are more atomic and composable. This also makes the `coalesce` and
`crush` methods on those operations more aggressive than the ones on
`MapReduceOp` were.

Fixes #271.

Also,

* fix a bug in `>>>` where it didn’t maintain the `base` properly and
* add integration tests for various map/reduce queries.
All these pending tests have a ticket, right? We should be very strict about never checking in a pending test case without a ticket, since otherwise it will be forgotten until we have reporting on test coverage.