Initial implementation of HDFSBackedBlockRDD.

This RDD pulls the block from BlockManager, if it exists in the Block Manager. If it is not found, the data is read from a file on HDFS.
Because when we re-insert the data into the BM, the iterator is traversed. So when we return the iterator it can't be traversed again and the data will not be accessible when compute returns. We can either not insert the data into the BM or we have to do this.