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.
Arg. Sometime I want a typesafe embedded DSL that produces Javascript! :)