Add missing `merge` cases.

This adds an explicit case for ReadOp↔︎MapOp and then a general
case (using `FoldLeftOp`) for other unhandled cases. Fixes #329.

This incidentally also

* replaces many cases of `foo.apply` in JS with `foo.call`,
* fixes some broken cases of MapOp/FlatMapOp `coalesce`,
* improves `FoldLeftOp.coalesce`, and
* removes the disjunction from `WorkflowBuilder.build`.
Fix the FIXMEs.

The first was an unnecessary case that’s covered by the general
case. The second is still a TODO (issue #347), but is now rewritten to
do the right thing less haphazardly.

However, the simple test for the ReadOp/MapOp merge, `select city,
loc[0] from zips` (which triggers this because you can’t project an
array element) currently makes _six_ requests against
MongoDB. Implementing `ExprOp.toJs` would allow us to convert
`ProjectOp`s to `MapOp`s, which would then be coalesced, cutting down
the requests to three.
Merge remote-tracking branch 'upstream/master' into ready/329-missing-merge
Add tests for the new merge cases.

This also includes tests @mossprescott wrote on `WorkflowBuilder`, as
well as some other improvements he made to `WorkflowBuilder` and
`WorkflowOp` to improve their testability.
Merge remote-tracking branch 'upstream/master' into ready/329-missing-merge

Conflicts:
	src/main/scala/slamdata/engine/physical/mongodb/workflowop.scala
Merge pull request #344 from sellout/ready/329-missing-merge

Add missing `merge` cases.