I like your suggestion and I've tried to switch the implementation to work that way but it's problematic:
- the GCR is synchronized on getOrCreateComponent
- this method gets invoked in order to create the ComponentRegistry
- the ComponentRegistryImpl creates a replicated cache which only now starts the transport
- the transport is started in a new thread that invokes GCR.getOrCreateComponent <-- deadlock

The proper solution to overcome this limitation is not trivial and requires GCR to run in parallel for component creation - too complex for the gain we get IMO.