Caches values returned by ProtocolComposer.communicateOrNull so it is called once per source/destination pair.