Keep bindings, mappings, and upstream computations from recursively marking forever

`addViewmodel` calls `applyChanges`, which calls `mark`, which calls `addViewmodel`. This is a quick-n-dirty fix that pushes upstream keypaths into the change list and makes sure they haven't already been marked before marking again.

Having the change queue clear would catch this case, but it breaks other tests. Would this be better handled with a separate tracking array (or something else entirely) to avoid having `cascade` called on upstream keypaths?

fixes #1526