Undo AbstractChannelHandlerContext extend PausableChannelEventExecutor. Fixes #2814

Motivation:
Our last-minute change that made AbstractChannelHandlerContext implement PausableChannelEventExecutor broke the socksproxy example.

Modifications:
AbstractChannelHandlerContext does not inherit from PausableChannelEventExecutor anymore. Instead we'll allocate an extra object on demand.

Result:

AbstractChannelHandlerContext.executor().newPromise() returns the correct type.
[#2797] Let EventExecutorGroup extend AutoCloseable

Motivation:

To make it more easy to shutdown an EventExecutorGroup / EventLoopGroup we should let both of them extend AutoCloseable.

Modifications:

Let EventExecutorGroup extend AutoCloseable and impement it.

Result:

Easier shutdown of EventExecutorGroup and EventLoopGroup
[#2823] Writing DefaultFileRegion with EpollSocketChannel may cause hang

Motivation:

In EpollSocketchannel.doWriteFileRegion(...) we need to make sure we write until sendFile(...) returns either 0 or all is written. Otherwise we may not get notified once the Channel is writable again.

This is the case as we use EPOLL_ET.

Modifications:

Always write until either sendFile returns 0 or all is written.

Result:

No more hangs when writing DefaultFileRegion can happen.
Adding window maintenance flag to HTTP/2 inbound flow control

Motivation:

Currently, window maintenance is automatically performed when a flow
control window drops below half its initial size. We should provide a
way for advanced applications to determine whether or not this should be
done on a per-stream basis.

Modifications:

Modifying DefaultHttp2InboundFlowController to allow enabling/disabling
of window maintenance per stream.

Result:

Inbound flow control window maintenance will be dynamically
configurable.
HTTP/2 to HTTP priority translation
Motivation:

The priority information reported by the HTTP/2 to HTTP tranlsation layer is not correct in all situations.
The HTTP translation layer is not using the Http2Connection.Listener interface to track tree restructures.
This incorrect information is being sent up to clients and is misleading.

Modifications:
-Restructure InboundHttp2ToHttpAdapter to allow a default data/header mode
-Extend this interface to provide an optional priority translation layer

Result:
-Priority information being correctly reported in HTTP/2 to HTTP translation layer
-Cleaner code with seperation of concerns (optional priority conversion).
Renaming "Observer" to "Listener" for consistency in HTTP/2

Motivation:

We currently have a mix of "Observer" and "Listener" for interface
names. We should make them all "Listener" to be consistent.

Modifications:

Renamed Http2DataObserver->Http2DataListener and
Http2FrameObserver->Http2FrameListener.

Result:

Listener interface names are consistent.
Exclude bin directory from git Motivation:

The 'bin/' directory is currently not in the .gitignore file.
Eclipse creates this directory to support IDE operations.
These directory is generated and not related to source code and therefore does not belong in git.

Modifications:
-Add 'bin/' to .gitignore

Result:
-No more 'bin/' directory confusion for eclipse users.
Custom EventLoop scheduling and EventLoop metrics

Motivation:

Currently Channels are assigned to EventLoops by a round-robin like algorithm: EventLoops are assigned sequentially and begin again at the start in a circular manner. This approach may not always be ideal, especially when an application handles different types of connections (e.g. long-living and short-living).

Modifications:

Introduce two new interfaces: EventLoopScheduler and EventLoopMetrics. The EventLoopScheduler interface allows a user to provide his own implementation of EventLoopGroup.next(). The default implementation remains round-robin. The (Nio|Epoll)EventLoops now support to collect information about them. This is done via the EventLoopMetrics interface. This information can also be used by an EventLoopScheduler implementation to influence scheduling.

Result:

1) Users can plug in their own algorithms into NioEventLoopGroup and EpollEventLoopGroup. 2) Users can gather information from EventLoops and use the information in their custom EventLoopScheduler implementations.