Add shardspec for hash based sharding and determine shard count by cardinality estimation

This pull request introduces support for random sharding by estimating cardinality of input data set using HyperLogLog and distributing the rows in shards on the basis on hashcode, Random sharding has two major improvements over singleDimension sharding -  
1) Better distribution of data resulting in almost equal sized partitions, thus achieving better query parallelism.
2) The mapper Job for cardinality estimation does very less Hadoop IO and thus is much more efficient than single dimension sharding.

Changes  - 
1) Support for Random Sharding
2) New PartitionSpec type introduced for random sharding 
3) Support for determining interval in determine partitions