[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 (CMBlockTransferService).

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
- CMBlockTransferService 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()



you mean onBlockFetchFailure in the second line ? And could you reword to `it is called exactly once for every failed block` ?