use a partitioner for the producer, so partitions can be controlled using a strategy

default behaviour stays intact

provided partitioner strategies:
- fixed partition (default partition 0)
- random distribution over multiple partitions (using Math.random)
- consistent hashing (configure algorithm and what part of the message should be hashed)