SPARK-2638 MapOutputTracker concurrency improvement

Spark-2638 Improve concurrency of fetching Map outputs

This issue was noticed while perusing the MapOutputTracker source code. Notice that the synchronization is on the containing "fetching" collection - which makes ALL fetches wait if any fetch were occurring.
The fix is to synchronize instead on the shuffleId (interned as a string to ensure JVM wide visibility).

For further details please refer to the JIRA.
This is not a correct fix for the following reasons:
* Should always use the same lock to protect the access of `fetching` to set up the happen-before relation.
* `fetching.wait()` should always be used under the protection of the `fetching` lock. See javadocs: http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()