Squash all the things

Just opening this up for final review (sorry I couldn't re-use the other one - blame Github).

This basically the same as before, with:

1. Just using the size of the snapshot input to calculate the number of reducers. I might leave an inline comment about this.
2. Merged the two `SnapshotWindows.startingDate()` functions - I see no value in the "max" version.
So this isn't using anything clever. I'm still wondering whether we can do something slightly better based on which features have windows (and how big they are)?