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.
@jdegoes: This is the new bound phase, which is optimal in the sense that it evaluates each node in the tree precisely once.

Questions:

1. Is this trampolined when composed with the other planner phases? It does many times less work than `lpBoundPhase`, but still could eventually blow the stack, if not.
2. How do we feel about this signature? This is similar to, but less powerful than `scanPara0`, in that it lacks the input annotation on the node, just because we aren't using that in `WorkflowPhase`.
3. I'm pretty sure this can trivially be generalized to work with any Monad, not just State, but State is what we need, so that's where I started.