[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

For very deeply-nested versions of this pattern, where you want to select the first non-None value among many alternatives while lazily computing them, I like doing something like

```scala
def sparkPreferredLocations = getBlockIdLocations().get(partition.blockId)
def hdfsPreferredLocations = HdfsUtils.getBlockLocations(...)
sparkPreferredLocations.orElse(hdfsPreferredLocations).getOrElse(Array[String].empty)
```

I kind of like this because it flattens the nested structure so the code reads as "here are the alternatives to choose among, defined in order of their precedence, and here's the line that tries them in order."  I'm not sure whether this is more or less confusing than the nesting for new Scala users, though.  There's probably an even nicer version of this without all of the intermediate `orElse` calls, but I guess that's only really necessary if you're picking among _many_ alternatives; it might be excessively confusing here.