better temp names; more efficient workflow phase (Fixes #391)

Use State in WorkflowPhase, WorkflowBuilder, WorkflowOp to generate
unique temp names (__tmp0, ...). This should allow more projectOps
to be collapsed in the future, but as of this commit the resulting
structure should be unchanged.

New, handwritten "bound" phase that evaluates each expression only
once, propagating `Let`s down the tree, and applying a bottom-up
annotation to the rest. This reduces the amount of evaluation being
done by about 30x in some cases.

Implemented some missing combinators and ops for PhaseS.
respond to PR feedback

Simplified some names and cleaned up much of the Attr-wrangling quite a bit.

Converted two more phases to use the new optimalBoundPhase.

SelectorPhase is still using the old lpBoundPhase because it needs a different
morphism (scanPara2) which the new phase cannot (yet) simulate.

Fix numerous bugs in the new optimalBoundPhase, and changed the type of the
annotation function to allow the monad to be threaded properly. In short,
The phase now maps over the result of each call immediately, so that
evaluation happens only once and then the result is used to annotate the
subexpression. In the previous commit, it was only appearing to work because it
was not properly annotating sub-nodes at all!

A few (surprisingly few) planner tests had their generated names shift a bit as
a result.
more PR feedback
- put JSExprPhase back to the way it was
- other minor stuff
Merge pull request #409 from mossprescott/ready/391

better temp names; more efficient workflow phase (Fixes #391)