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.
Why? I can't see why this isn't implemented. And if there is a good reason, it should call Crash not sys.error.