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.
Hi TD, through careful thought, I think I think there's a inconsistent issue, since now generate new block buffer and get the offset snapshot of this block are synchronized with two locks: BlockGenerator lock and Receiver lock. There's a chance to schedule another message handler to put data into BlockGenerator, rather than get offset snapshot of current block, so the snapshot we got lastly will not related to the block we generated.

I think we should put `currentBuffer = new ArrayBuffer[Any]` and `onGenerateBlock` in the same synchronized section to avoid this problem.