[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, as for now, this method is called by doPut 1) and doGetLocal to put data from disk into memory 2), all this two are got related blockinfo.synchronized, So will there need used info.synchronized again?