[SPARK-2677] BasicBlockFetchIterator#next can wait forever

Why is this `synchronized` needed?  Aren't all writes to the promise already guarded by the `messageStatuses.synchronized` lock?