Improved scan, reduce, aggregate

`scan` is currently restricted to accumulators of type `Func2<T, T, T>` where `Func2<R, T, R>` would be possible for initial values of type `R`. This pull request tries to fix this by generalizing the `scan` implementation. I had to restructure the scan operator a bit for this to stay typesafe. Imho it's more readable now, though.

This indirectly leads to generalized `reduce`, too.

Also, `aggregate` is added as an alias for `reduce` (see #20).