PARQUET-108: Parquet Memory Management in Java

PARQUET-108: Parquet Memory Management in Java.
When Parquet tries to write very large "row groups", it may causes tasks to run out of memory during dynamic partitions when a reducer may have many Parquet files open at a given time.

This patch implements a memory manager to control the total memory size used by writers and balance their memory usage, which ensures that we don't run out of memory due to writing too many row groups within a single JVM.
This version of DataWritableWriteSupport is for Hive 0.10 - Hive 0.13. This version of DataWritableWriteSupport will never have access to an updated version of HiveCOnf as the new DataWritableWriteSupport lives in Hive. Effectively this version of DataWritableWriteSupport is deprecated.

As such, I think we should add a property "parquet.memory.pool.ratio" to ParquetOutputFormat. Users of Hive will be able to set that property in their hive-site.xml.