Optimize query engines for stateless-query-engine use
Many times the only query-engine in use is the stateless query engine. This can lead to quite inefficient operation as the default query engine assumes that accessing the leaf-type-trees is pretty cheap but for stateless a new one must be constructed each time.
To avoid this all functions that unconditionally create a LeafTypeTree are made virtual so the stateless can override them. A few functions which previously unconditionally created a LTT were rewritten to not do so.
This also updates the UnionQueryEngine to use the unioned implementations of these functions.
PiperOrigin-RevId: 676170979