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.
This is a bit ugly, I assume that this is because entity is variable length. It makes me think that the variable length should always go on the right. This means we can't use built in BytesComparable but it would make this a lot more obvious and sensible for me. Was there any other downsides to the other ordering besides can't use the builtin one?