[SPARK-3250] Implement Gap Sampling optimization for random sampling

More efficient sampling, based on Gap Sampling optimization:
http://erikerlandson.github.io/blog/2014/09/11/faster-random-samples-with-gap-sampling/

I agree, "Partition" is overloaded in Spark, although it's equally correct in both contexts.   Maybe "Cell" is a decent alternative:
http://en.wikipedia.org/wiki/Partition_of_a_set

So it would be `BernoulliCellSampler`