Update ShuffleMemoryManager to be able to partially grant requests

Instead of returning false if we can't grant all the memory a caller
requested, we can now grant part of their request, while still keeping
the previous behavior of not forcing a thread to spill if it has less
than 1 / 2N, and not letting any thread get more than 1 / N. This should
better utilize the available shuffle memory pool.