Add abstraction for HashGeneration

1. Add abstraction for hash generation
2. Add an optimizer that uses optimized hash generation for
AggregationNode and DistinctLimitNode
3. Add helper methods and test for additional hash channel
4. Add a switch to turn the feature on/off
Note: This PR only addresses operators that use GroupBy. There will be
an additional PR that will address PagesIndex
MarkDistinctNode
RowNumberNode
TopNRowNumberNode