Latest batch of changes seem to have been worthwhile., the CI server finally built clean, no problems.
The OOME exception explains how we could hit a OneShotServiceCreator more than once ... the exception prevented the creation of the service after the lock flag was set, so on retry, we get the "depends on itself" exception.
Meanwhile, the CastInsensitiveMap was causing much confusion under stress, since it wasn't threadsafe. Under the right circumstances, map.get() != map.get() ... you could ask for an object with key A and get the value for key B.
I think that's it, and I'll be rolling back a couple of extra syncrhonized blocks before closing the bug. And monitoring the CI server to see if there are any further errors.