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.
It's quite OK in my local test.