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.
> Was there any other downsides to the other ordering besides can't use the builtin one?

Definitely no technical reason. Apart from the being able to use `BytesComparable` I basically find it easier this easier to grok when the order matches the actual sorting.