[SPARK-3453] Netty-based BlockTransferService

I tested the new network shuffle code. This network shuffle code can support ~ 1GB/s per node network speed while producing almost no garbage that would trigger gc.

Issues addressed in this pull request:
- SPARK-3453: Refactor Netty module to use BlockTransferService interface
- SPARK-3016: Block upload
- SPARK-3018: Release all buffers upon task completion/failure
- SPARK-3002: Create a connection pool and reuse clients across different threads
- SPARK-3017: Integration tests and unit tests for connection failures
- SPARK-3049: Make sure client doesn't block when server/connection has error(s)
- SPARK-3502: SO_RCVBUF and SO_SNDBUF should be bootstrap childOption, not option
- SPARK-3503: Disable thread local cache in PooledByteBufAllocator

Review guide:
- server/client protocol is defined in protocol.scala
- please look closely at ShuffleBlockFetcherIterator, in particular, parts related to reference counting and cleanup of buffers

Things that should be done in separate PRs:
- SASL security support
- (maybe) use BlockID instead of String for stronger types in block ids

Thanks to @normanmaurer who reviewed the code offline with me.
I don't know if it's on purpose, but both send and receive buffer size options in `NettyConfig` use the same config key `spark.shuffle.io.sendBuffer`, so you might set both at the same time here.