[SPARK-4062][Streaming]Add ReliableKafkaReceiver in Spark Streaming Kafka connector

Add ReliableKafkaReceiver in Kafka connector to prevent data loss if WAL in Spark Streaming is enabled. Details and design doc can be seen in [SPARK-4062](https://issues.apache.org/jira/browse/SPARK-4062).
Because this hook function `onGenerateBlock` is called in function `updateCurrentBuffer`, which is synchronized with BlockGenerator object, so  I don't think we need to add another lock here. At the time `updateCurrentBuffer` is called, because we get a lock, so there is no data will add into BlockGenerator and insert offset into topicPartitionOffsetMap.