[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).
Could you use var's instead of lazy val? Bascially, the reciever should be designed to be multiple lifecycles (start, stop) and `lazy val` causes initialization only in the first `start` and likely not cleared when `stop` is called. So its a better design pattern to use `vars` and explicit initialization on start(), rather than `lazy vals`.