handle JS exprs in ExprBuilder and DocumentBuilder (Fixes #393)

We now track JS expressions the same way we track ExprOps, so
that they can be built on top of partially-constructed $group ops.

When JS and ExprOp expressions are combined, we convert the ExprOps
to JS (via JsCore), and generate a fused $simpleMap. Not all ExprOps
are yet handled, and at least a few cannot be handled; planner
errors are generated for unhandled cases.

As a result, `toCollectionBuilder` can now fail, which was the first
domino in a long line, and most of the functions in
WorkflowBuilder that used to return `MId` (aka `State[NameGen, _]`) now
return `M` (aka `StateT[EitherE, ...]`). I think this actually makes
life a bit simpler, but I'm getting tired of switching.

Also, objectConcat now recognizes when docs are built on mergable groupbuilders and does the right thing (fixing the simple query shown in the ticket).
This works:
```scala
exprOps.map((-\/.apply[ExprOp] _).second))
```

But, yeah.