[RFC] Refactor DOM properties diffing logic

Better version of 1543.

This generalizes the diffing into a `diffProperties` method that we can use recursively, both for updating all the DOM props and for the style object. The method calls the delete/update callback for each appropriate object key. This saves a potential allocation that we used to have due to generating a diff for `style` and passing it onto `setValueForStyles`. This'll be an even bigger win for future props (dataSet, ariaSet), since none of those would allocate.

Another upside is that the code's more readable (I feel?).

The downside is it's slightly slower, because it's calling a callback for each prop rather than passing a diff onto `setValueForStyles`, which iterates over it.
performX / applyX perhaps? diffObjects sounds like it should return the difference. prevObj is not at all the previous object, but rather the current object and what's really going on is that we want the current object to apply the difference between itself and nextObj, so that it becomes value-wise identical to nextObj. IMHO.