Instead of passing the executor instance, we only need to pass the current transaction which is to be used for processing and running any queries.
Instead of blindly cloning document values (even if we don't need to mutate them), we now use copy-on-write semantics to only create a copy if we need to update a document value. This improves performance, especially when selecting documents.