Name resolver API + implementations

Motivation:

So far, we relied on the domain name resolution mechanism provided by
JDK.  It served its purpose very well, but had the following
shortcomings:

- Domain name resolution is performed in a blocking manner.
  This becomes a problem when a user has to connect to thousands of
  different hosts. e.g. web crawlers
- It is impossible to employ an alternative cache/retry policy.
  e.g. lower/upper bound in TTL, round-robin
- It is impossible to employ an alternative name resolution mechanism.
  e.g. Zookeeper-based name resolver

Modification:

- Add the resolver API in the new module: netty-resolver
- Implement the DNS-based resolver: netty-resolver-dns
  .. which uses netty-codec-dns
- Make ChannelFactory reusable because it's now used by
  io.netty.bootstrap, io.netty.resolver.dns, and potentially by other
  modules in the future
  - Move ChannelFactory from io.netty.bootstrap to io.netty.channel
  - Deprecate the old ChannelFactory
  - Add ReflectiveChannelFactory

Result:

It is trivial to resolve a large number of domain names asynchronously.

Example:

```java
NameResolverGroup<InetSocketAddress> resolvers = new DnsNameResolver(...);
Bootstrap b = new Bootstrap();
...
b.resolver(resolvers);
...
b.connect();

resolvers.close();
```
Either lazySet is not correct or the compareAndSet(...) usage should be replaced by weakCompareAndSet(...) here:
https://github.com/netty/netty/pull/2917/files#diff-d32ff1e89d58b8a886a8702c4edb5418R80

Same goes for the other lazySet usage. Remember lazySet and weakCompareAndSet are only usable if every modification is only done by the same thread.