[SPARK-3463] [PySpark] aggregate and show spilled bytes in Python

Aggregate the number of bytes spilled into disks during aggregation or sorting, show them in Web UI.

![spilled](https://cloud.githubusercontent.com/assets/40902/4209758/4b995562-386d-11e4-97c1-8e838ee1d4e3.png)

This patch is blocked by SPARK-3465. (It includes a fix for that).

Try to reclaim as much memory as possible, so latter sort and spill can process as much more data as possible. @mateiz had done some benchmark for ExternalMerger, this can improve the performance for some cases (such as list of lint).

Also, after gc.collect(), the used_memory() will be more accurate.