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.
respond to PR feedback
- replace ListMap.transform with ∘ (a synonym for Functor.map)
- collapse the un-handled cases in ExprOp
- make (un)typers for min/max slightly less bogus
- a couple of other small typer fixes
fix simple expression on JS expr
Merge pull request #448 from mossprescott/ready/393

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