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.
As mentioned in another comment, please just go ahead and make everything a ConcurrentHashMap again and we don't need to bother with synchronizing the getters.