Broke ReduceKey into two classes (ReduceKeyMapSide and
ReduceKeyReduceSide) so on the reduce side, we don't need to have an
extra level of indirection (BytesWritable). This can save the amount of
memory needed for joins and aggregations.