WIP: FeatureReduction and Squash

Opening this up for some early eyeballing. It's not all that different from the original PR/branch. The important change is that I'm grouping by featureId, and handling multiple entities in the reduce step.

Two things I _know_ need to be fixed:

1. The reducer count calculation. Any suggestions for what is the correct/best way to calculate this?
2. Squash currently needs `SnapshotMeta`, which we don't currently have for `chord` pivots. This partly depends on what we may (or may not) need for the reduce count. It might also be better to do something once #266 is merged to avoid merge conflicts.

I haven't tried doing anything about the pure reduce functions yet, although I'm not expecting that to be too disruptive assuming everything else is mostly in the right place.
I know the final version of this (and count) may look different, but I was a _little_ surprised that thrift makes no attempt to share non-optional struct values between reads. So even `ThriftFact` in `NamespaceThriftFact` is created per fact row. Not sure if there's anything we can/should do about that.