InvalidationTree
The purpose of this data structure is to store which nodes changed and need to be synchronized, but limit the memory consumption via the sizeLimit, which determines the maximum number of nodes in a subtree.
If there are many changes in one part of the model (changed subtree size sizeLimit), we do not keep track of the individual changes anymore and just synchronize the entire subtree.