[SPARK-1888] enhance MEMORY_AND_DISK mode by dropping blocks in parallel

It's unefficient to drop memory blocks to disk inside a synchronized block as IO is slow. As the TODO says, we just need synchronize selecting blocks to be dropped. So my implementation is: in `ensureFreeSpace`, we iterate entries and select blocks to be dropped. But instead of dropping block inside `ensureFreeSpace`, we can just mark selected entries as dropping, and return these blocks, let the caller do the dropping. When other thread call `ensureFreeSpace` again, they will skip entries that marked as dropping when iterating entries. And the caller, `tryToPut`, will do the dropping before put the new block into entries. In this way, we can do dropping in parallel.
Hi @cloud-fan , you removed `accountingLock.synchronized` here, so there will be more than one thread call `planFreeSpace` here for reserving memory. And each thread will asking for memory with size `maxUnrollMemory - currentUnrollMemory`. I think the logic is not the same with the original intention. 

There is second question, what if `maxUnrollMemory` is large (`maxMemory*unrollFraction` might be dozens of GB large), while the requested memory `amountToRequest` is small (maybe dozens of MB), then you only use one thread to free the size, which is `spaceToEnsure`, this seems doesn't solve the IO issue.

Third, since you are lazy drop the to be dropped blocks, how can you avoid OOM which is @andrewor14 pointed out (the putting speed is faster than dropping)?

Does the three problems exists in the current patch? Maybe I missed something.