Prevent start/endBatch from forcing invalidation

This fixes the specific bugs [#57606290] and [#57767186]

We had been making the assumption that startBatch/endBatch would always enclose something that triggered an invalidation (and thus a recalculation of the model physics, a resetting of points on any graphs, etc). Thus we triggered the invalidation ourselves when startBatch was called.

Now we lazily wait for an invalidating change to occur during a batch, and only end the invalidation sequence if an actual invalidating change was made.

This became an issue because processTransitions is called every MD2D tick and always invokes start/endBatch to batch the transitions -- even if there are no transitions. This had performance side effects and subtler effects on the graphs.

 (The graph controller resets the graphed points every time it sees an invalidation, and this cancels in-progress domain shifts. When the invalidation occurs every tick, this meant domain shifts never really got started.)

It seems reasonable that, rather than forcing every user of start/endBatch to decide in advance if it's actually going to make invalidating changes, to simply cause start/endBatch to be no-ops if no invalidating changes occur between them.