[SPARK-3074] [PySpark] support groupByKey() with single huge key

This patch change groupByKey() to use external sort based approach, so it can support single huge key.

For example, it can group by a dataset including one hot key with 40 millions values (strings), using 500M memory for Python worker, finished in about 2 minutes. (it will need 6G memory in hash based approach).

During groupByKey(), it will do in-memory groupBy first. If the dataset can not fit in memory, then data will be partitioned by hash. If one partition still can not fit in memory, it will switch to sort based groupBy(). 
This is a change from the old behavior.  Based on our discussion, I guess that we only return a ResultIterable in cases where we spill and still return a list in the non-spilling cases?