beginExecution
Pins the catalog this execution will read, and builds the mappers over it.
Taken here rather than when the query was constructed, because registerResultConverter and its write-side twin run in between; and per execution rather than once, because a query object can be run again after a registration or a reloadTypes(), and the second run should see them.
Everything downstream - the parameter serializer, the result mapper, the Rows it produces, the type lookup converters are handed - reads this one catalog, so a registration on another thread cannot land in the middle of a result and leave it mapped against two of them.
The query's own converters are copied for the same reason: the Rows outlive the execution, and the lists they would otherwise share are the ones a later registration on this query appends to.