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.

*Note: * There is some awkward wrangling of `Attr`s going on here. Suggestions about how to make this cleaner are welcomed. See comments on the changes.
1. Not sure I'm following. The monad I'm using is `State[NameGen, Error \/ WorkflowBuilder]` (*not* EitherT or StateT, for reasons that I explain in a comment). So effectively the only monad in play is State, right? It's less of a problem since the evaluation is linear in the size of the input now, though.
2. The other two phases are currently using `synthPara2`, so could be converted to use this, to improve their efficiency if nothing else. I guess that would mean variants of this method taking `f`s with different signatures, right?
3. I'll give that a shot, and wrap it for `State`.