Infinite channel memory usage optimization

Hey I've been using yours tools, but I've found that buffer implementation is not quite friendly to garbage collector. Currently on each "infinite" queue pop, an element goes out of scope, to be collected by GC.

But by using ring-buffer we could re-use already allocated memory, new alloc happens only when buffer is to small to handle all elements.

I've modified accordingly other implementations, so if you'll like this change I could send more PRs