Initialize transports on demand

This avoids creating NioEventLoopGroups for unused transports. It also avoids logging a warning if the UDT library is unavailable even when its not used.

I've changed clientToProxyBossPools and clientToProxyWorkerPools to be HashMaps as they are (and were) only accessed while holding a lock on the server group, so the overhead of a CCM is unnecessary. It might be worth going further and making getProxyToServerWorkerFor() synchronized, allowing proxyToServerWorkerPools also to be a plain HashMap.
Ah, gotcha.  I was looking at doStart.  So yes, in theory this should work and I'm happy to merge as is.

Purely out of curiosity, did you encounter a specific performance issue that you are addressing by making this a HashMap instead of a ConcurrentHashMap?