[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).
Yes, that sounds great, previously synchronized section in BlockGenerator is method, we can refine the lock section to make it better performance. 

There's one thing I think should take care: add message into BlockGenerator and update offset should be in one synchronized section, and be exclusive to the stream block generation and offset snapshot cut (the latter two action also should be in the same synchronized section). Otherwise we will get wrong result potentially.

If we introduce 2 locks, we should also follow the previous rule and avoid dead lock.