Two concepts here:
1. experimenting with an alternate approach to defining aggregation (the 'agg' function, rather than 'reduce')
2. Changed the type of 'Reduce' to use dependent object types to express the concept that reductions can maintain an 'aggregated' state. This allows 'Sum' to naturally maintain a Double, which is the value exposed by taking a 'Sum' on a stream. Previously a Reduction exposed itself as the collected value, which meant that you had to further map 'Sum' to 'Sum.sum' to get at the actual number. By using dependentObjectTypes, I get to use this.type for reductions that expose themselves.

Yes, that's a pretty major API change and introduced me to an exciting compiler bug (luckily only in test code)
Merge remote-tracking branch 'origin/master'