Motivation:

Currently when a new event loop is needed to register a channel our EventLoopGroup implementations just use a round-robin like algorithm to choose the next event loop. Unfortunately this is not always good enough as different event loops may become more busy than others over time. This is especially true when an application handles different kinds of connections (long-living and short-living). This change allows developers to plug in their own algorithms to choose the next event loop and to collect metrics about the busyness of the event loops.

See #1230

Modifications:

- TODO

Result:

- Developers can plug in their own algorithms into MultithreadEventLoopGroup constructors.
- Developers can gather metrics/feedback from the event loops and use the data in their custom algorithms.