Refactor aggregations

Introduce a new base class for aggregation functions that makes them
simpler to write.

It looks like there's a small (~3% performance regression), but given how much this simplifies the code, I think it's worthwhile. We could also try to get that back with byte code generation.

master:
                  hand_tpch_query_1 :: 2907.023 cpu ms :: in    6M,   361MB,   2.06M/s,   124MB/s :: out     4,    300B,       1/s,    103B/s
                  hand_tpch_query_6 ::  308.901 cpu ms :: in    6M,   240MB,   19.4M/s,   778MB/s :: out     1,      9B,       3/s,     29B/s

my branch:
                  hand_tpch_query_1 :: 2937.362 cpu ms :: in    6M,   361MB,   2.04M/s,   123MB/s :: out     4,    300B,       1/s,    102B/s
                  hand_tpch_query_6 ::  321.828 cpu ms :: in    6M,   240MB,   18.6M/s,   747MB/s :: out     1,      9B,       3/s,     27B/s