Generate FetchFailedException even for cached missing map outputs

Currently, MapOutputTracker generates a FetchFailedException if it fetches new map output locations from the master and finds that at least one map output is missing, but it generates a NullPointerException when the missing map output location is cached locally. (This is likely to occur when two parallel reduce tasks ask for the map output locations at roughly the same time.) This patch generates a FetchFailedException instead (triggering the correct fault-handling code). It also includes some tests which trigger MapOutputTracker's output location fetching code.