[SPARK-4028][Streaming] ReceivedBlockHandler interface to abstract the functionality of storage of received data

As part of the initiative to prevent data loss on streaming driver failure, this JIRA tracks the subtask of implementing a ReceivedBlockHandler, that abstracts the functionality of storage of received data blocks. The default implementation will maintain the current behavior of storing the data into BlockManager. The optional implementation will store the data to both BlockManager as well as a write ahead log.

I wanted to have a single clean interface out here (kind of like BlockStore, used in BlockManager, which is the base for MemoryStore, DiskStore, TachyonStore). We have only two implementation now, but in future there can be other implementations. For example, one may want to log to Cassandra, which will require a third implementation CassandraBasedBlockHandler. Hence I dont want the return type to have a specific type as the return type will be specific to the implementation.