Implement client pools

Client pools handle selecting a client from a list of
multiple clients based on a selection policy.

Signed-off-by: Peter Foldes <peter.foldes@turn.com>
I went back and forth on this for a while, but iterables are somewhat hard to manage when the underlying pool can continuously change, although I like the idea of users shuffling their representation.

My problem here is that let's assume that there's some underlying server registry that can dynamically change. Now we have a client pool that needs to react to 1) changes in the server registry and 2) channels going down for some reason. In either case, we need to drop a client and/or potentially add a new one. Iterables and iterators generally don't like this sort of thing and their behavior in undefined in most cases, except when the removal is done through the iterators themselves (adding is always undefined behavior). This also means that infinite cycle through them is close to impossible. Not sure how else to solve the issue then forcing some ordering on the repesentation itself (list in this case) and handling selection of the next client through random access.