CodecScope
The dictionaries a container or domain codec resolves through as it walks a value.
A codec for a composite, array, range, multirange, record or domain has to look further codecs up - one per attribute, per element, per bound - and the pair it looks them up in is the pair of the catalog it was built for. It cannot simply hold that catalog: it lives inside the very CodecDictionary it would be pointing at. This is where that knot is tied, and it is the only object that can be made before the codecs and still name the dictionary they end up in - which is the whole reason it exists rather than each codec carrying a field of its own to fill in afterwards.
What it buys is a decode that does not move underneath a running statement: a value nested inside a column is resolved against the same dictionaries as the column itself, however long the result takes to read and whatever is registered in the meantime.