[SPARK-2677] BasicBlockFetchIterator#next can wait forever

Even though access to `isAckTimeout` is guarded by the `messageStatuses` lock, I think there's still a race condition here.  According to the [Timer.cancel()](http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html#cancel()) docs, `cancel()` "does not interfere with a currently executing task (if it exists)."  So, there's still the potential for the timeout task to race with the message, start running and get blocked waiting to synchronize, and eventually run and throw an exception.