Improved dirtiness propagation

This improves the mechanism whereby dirtiness is propagated through the dependency graph by accumulating all affected plugs during the traversal and then emitting all the signals at the end. The previous mechanism could emit the same signal multiple times if the graph branched and then merged, and the new mechanism avoids that.

Now I think about it, I wonder if we should somehow synchronize the emission with the ending of an UndoContext to further batch up the processing? I think that would be best left to another pull request though - this pull request is already sufficient to address the specific issues we're having right now  in the InteractiveRenderManRenderer.