Precompute hash for nodes that need hash

    1. Add abstraction for hash generation
    2. Add an optimizer that uses optimized hash generation for all nodes
    that use groupByHash and lookup source
    3. Modify operator test to run for both with and without hash generation enabled
    4. Add a config option and session property to turn the feature on/off

Microbenchmarks: 
GroupByHash https://gist.github.com/nileema/2010aa90023dc0cce6d8
HashPagePartitioningFunction: https://gist.github.com/nileema/58e08ef66aed0c3209ef

`checkArgument(!hashChannel. isPresent() || hashChannel.get() < types.size(), "invalid hashChannel");`