[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.

Why not just do this then - it doesn't involve type traits and it's better than what's there now. Having `Option[Any]` as a return type in our codebase is really bad style.

```
class StoredBlockInfo {
  val blockId: String
  val fileSegment: Option[FileSegment]
}
```