[SPARK-3019] Pluggable block transfer interface (BlockTransferService)

This pull request creates a new BlockTransferService interface for block fetch/upload and refactors the existing ConnectionManager to implement BlockTransferService (NioBlockTransferService).

Most of the changes are simply moving code around. The main class to inspect is ShuffleBlockFetcherIterator.

Review guide: 
- Most of the ConnectionManager code is now in network.cm package
- ManagedBuffer is a new buffer abstraction backed by several different implementations (file segment, nio ByteBuffer, Netty ByteBuf)
- BlockTransferService is the main internal interface introduced in this PR
- NioBlockTransferService implements BlockTransferService and replaces the old BlockManagerWorker
- ShuffleBlockFetcherIterator replaces the told BlockFetcherIterator to use the new interface

TODOs that should be part of this PR:
- [x] Bring this up to date with master
- [ ] Look at the removed unit tests and see if they still make sense to be added back

TODOs that should be separate PRs:
- [ ] Implement NettyBlockTransferService
- [ ] Finalize the API/semantics for ManagedBuffer.release()



Then, how did you plan to handle this securityManager parameter? move it into BlockTransferService interface ( though some implementation might not need it) to  make it easy for instantiate works? or some how tweak connectionManager to make it use SecurityManager in lazy way so that it can retrive it from SparkEnv?