Add support for hash partitioning on multiple channels
Add full support for DISTINCT in aggregations

DISTINCT is processed in a couple stages.
First a marking stage hash partitions the rows on the DISTINCT expression as well as any GROUP BY clause, and then marks the unique rows.
Second the aggregation operators only process the unique rows, if they have a DISTINCT expression
Fix NullPointerException when reading from S3
Use ImmutableEnumSet
Fix use of closed RecordReader