Fix fifo queue logic to support multiple producers and consumers
Add multi-threaded tests
Fix read next logic, make sure it is correct after refreshing. In the partition side, added a readhead which moves whenever readnext() or the dequeue head pointer moves past it.
Remove read_next offset from client side to partition side.
What is the expected behavior if dequeue happens on an empty queue? Should the consumer catch an error or should we change dequeue as std::queue::pop, to not return anything?
This looks fine. Is it ready to merge? I don't see a multi-threaded test?