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. It's only trampolined if the base monad is trampolined. Also, Scalaz StateT / State is implemented in a trampoline-unfriendly fashion, in that it's quite likely to stack overflow on deep hierarchies. The basic problem is that State is implemented as `S => M[(S, B)]`, whereas it should be `M[S => M[(S, B)]`. But we can also do a PR to Scalaz to fix that problem, so for now only worry about whether the base monad in your stack is trampolined.
2. I'd suggest generalizing to `scanPara0` so we can use it for all phases.
3. I'd also suggest generalizing to work with any monad. Generally that makes the code simpler rather than more complicated.