[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.
Used to be a single update callback, but then you'd have to put `if (... === undefined)` in some places, so I made the differ do it instead, which makes sense imo.

And yeah, that's a better formulation. Thanks