introduce legacy incremental executor (#4546)
Motivation: to ease user base upgrade path. The legacy incremental executor uses the legacy format which is not expected to be included within the spec and clashes with the new format.
Note: the legacy incremental executor is a branching executor, it uses the legacy format that duplicates fields within the response as well as the underlying legacy behavior in which those fields are re-executed, with potentially conflicting field values. In particular, nulls may bubble up in one branch and not another. The transformer approach from #4319 keeps the legacy format without re-executing because it transforms the non-branching incremental executor response.
[It was previously thought not possible to release a legacy incremental executor using the same underlying machinery as the new one, see #4319, but I cannot understand the explanation I previously gave to that effect.]