Refactored Kafka receiver logic and Kafka testsuites

Changes
- ReliableKafkaStreamSuite was running KafkaStreamSuite tests as well, as it was extending it. So refactored KafkaStreamSuite to create KafkaStreamSuiteBase.
- Used `eventually` blocks instead of `Thread.sleep` to reduce test run times. 
- Other general refactoring the in the ReliableKafkaStreamSuite to minimize duplicate code.
- Refactored ReliableKafkaReceiver to implement the better synchronization, and also improve (hopefully) code cleanliness.
consumer thread A           block generator(bg) thread             consumer thread B

receiver.lock
bg.lock
bg.+=
bg.unlock                                       bg.lock
                                                      generator new block
                                                      bg.unlock
update offset
receiver.unlock
                                                                                                     receiver.lock
                                                                                                        .......
                                                                                                     receiver.unlock
                                                        receiver.lock
                                                        get the snapshot
                                                        receiver.unlock