[SPARK-4027][Streaming] HDFSBasedBlockRDD to read received either from BlockManager or WAL in HDFS

As part of the initiative of preventing data loss on streaming driver failure, this sub-task implements a BlockRDD that is backed by HDFS. This BlockRDD can either read data from the Spark's BlockManager, or read the data from file-segments in write ahead log in HDFS. 

Most of this code has been written by @harishreedharan

Let's make this dead simple. There is no need to create two extra functions and call getOrElse.

Just do
```scala
locations.get(partition.blockId)) match {
  case Some(loc) =>
    loc
  case None =>
    val segment = partition.segment
    HdfsUtils.getBlockLocations(segment.path, segment.offset, segment.length, hadoopConfiguration).getOrElse(Seq.empty)
}
```