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.
How hard would it be to add an disjunction to this stack? Unbound vars is going to be an issue in anything that would take advantage of the bound phase, so it seems like we should try to figure that out (IE, it’s not like a slightly different implementation would allow us to eliminate any chance of an error).

At least add a FIXME + issue (FIXME comment should mention the issue number) to come back and address this, since it shouldn’t be a problem until we allow non-SQL interfaces to the LogicalPlan.