[WIP] [SPARK-2468] Netty based block server / client module

This is a rough draft, but it can't be much worse than the old Netty module since the old one didn't really work :) 

For this pull request, I tried to make the changes non-instrusive to the rest of Spark. I only added an init and shutdown to DiskBlockManager, and a bunch of comments to help me understand the existing code base.

Compared with the old Netty module, this one features:
- Basically a rewrite of the old Netty module, which was introduced about 1.5 years ago but turned off by default
- It appears to work :) The old one didn't have a frame decoder and only worked for blocks with very small size
- SPARK-2941: option to specicy nio vs oio vs epoll for channel/transport. By default epoll is used on Linux, and nio is used on other platforms
- SPARK-2943: options to specify send buf and receive buf for users who want to do hyper tuning
- SPARK-2942: io errors are reported from server to client (the protocol uses negative length to indicate error)
- SPARK-2940: fetching multiple blocks in a single request to reduce syscalls
- SPARK-2959: clients share a single thread pool
- SPARK-2990: use PooledByteBufAllocator to reduce GC (basically a Netty managed pool of buffers with jmalloc)

Compared with the existing communication manager, this one features:
- IMO it is substantially easier to understand
- zero-copy send for the server for on-disk blocks
- one-copy receive (due to a frame decoder)
- Should create much less garbage because of SPARK-2990 (PooledByteBufAllocator)
- don't quote me on this, but I think a lot less sys calls

TODOs before it can fully replace the existing ConnectionManager, if that ever happens (most of them should probably be done in separate PRs since this needs to be turned on explicitly)
- [ ] Lots of test cases
- [ ] Performance analysis
- [ ] Support client connection reuse so we don't need to keep opening new connections
- [ ] Support serving non-disk blocks
- [ ] Support SASL authentication


Thanks to @coderplay for peer coding with me on a Sunday.

This listener will be used twice. One is for writing block header, the other is for sending block. But the log info will show sent the same block twice?