[SPARK-4084] Reuse sort key in Sorter

Sorter uses generic-typed key for sorting. When data is large, it creates lots of key objects, which is not efficient. We should reuse the key in Sorter for memory efficiency. This change is part of the petabyte sort implementation from @rxin .
It's also funny that Java ignores the protectedness, maybe we can upgrade all actually-public methods to public (that's everything but `getKey(data: Buffer, pos: Int)`, which is only used internally)