Add Aggregator.zip

This returns a composite aggregator with a tuple input, which comes in handy if you have an initial input that has to be prepared differently for each of the joined aggregators.
This is a nice addition.

Can you add a comment that the law here is this:
```scala
agg1.zip(agg2).apply(as.zip(bs)) == (agg1(as), agg2(bs))
```