dataflow refactoring: separate results of analysis from internal machinery.

The main benefit of this as presented here is just removing the need
to parameterize over DataFlowOperator everywhere.  But it sets the
stage for future improvements, such as making `propagate` a method
that consumes the context and produces the results.
dataflow clients: use DataFlowResults for results instead of DataFlowContext.
Changed dataflow's `propagate` method to be linear.

Now it consumes the receiving DataFlowContext, and returns the
resulting DataFlowResults.  (This is just meant to clarify the
protocol for usage.)
dataflow: Removed some unnecessary deriving(Clone)'s and trait bounds.
Made `results` field non-pub since it is now returned via `propogate`.