validatePlan
Checks a plan before a transaction is opened, so a malformed one fails before any step has done its work: a query that cannot render, and a handle naming no step ahead of it in this plan. The second can only come from another plan - its handle, merged in the wrong order or not at all.
Return
Where each step sits, by handle, for naming steps in failures; after TransactionPlan.addPlan a handle's own index is not where its step sits.
Throws
INVALID_ARGUMENT where a step's query cannot render, or a step binds a parameter to a handle from another plan or to a step that runs after it.