[SPARK-3453] [WIP] Refactor Netty module to use BlockTransferService interface

Issues addressed in this pull request:
- SPARK-3453: Refactor Netty module to use BlockTransferService interface
- 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

Also includes some partial support for uploading blocks. Will finish this and then remove the WIP tag.

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


Thanks to @normanmaurer who reviewed the code offline with me ...
i don't think so -- it is stateful? also it is tricky to handle connection failure in this case.