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.
> seeing sentinels like minValue makes me a little un-easy, how does this flow through everything else?

It allows the latest expression to be handled generically by `fr.date <= fact.date.int` in `SquashReducerState` below. Alternatively, and what I had previously, was to not set `date` on `FeatureReduction` and handle that as a special case. There may be better/cleaner alternatives.