[SPARK-4873][Streaming] WriteAheadLogBasedBlockHandler improvement

1. Move the block store work to a separate thread pool. IO work usually runs longer than CPU work. Running IO work in `Implicits.global` may block other work that want to run in `Implicits.global`.
2. Use `Future.zip` instead of `Future.flatMap`(for-loop). `zip` implies these two Futures will run concurrently, while `flatMap` usually means one Future depends on the other one.
3. Fix a unit test in `ReceivedBlockTrackerSuite` which may fail occasionally.
> The thing is that deleting asynchronously is an implementation detail - which we choose to do now, which can be changed later, don't you think? If we change it later, we'd have to change this method's signature - which can cause pain if there is code that uses Await.result(*) on this future.

I doubt if it will be changed. However, `asynchronously` is an important implementation detail that the caller should know it, or they may misuse it.

> If we expose it via a parameter, we can choose to ignore the param and still the calling code will not have to change. Since it is unlikely that the calling code will actually depend on the async nature, it is unlikely to see any difference in functionality and no change in code is required.

I don't think a parameter is enough. At least, it needs a more parameter, a `timeout` parameter. In your PR, you used `1 second` which may not be enough.