See contained diff.
The upsampling is important for Voice Messages, but is being done here because it's easier to add all the tests at once.
This also introduces a new Object utility - that will be tested on its own commit.
The object diff optimisation in 32cca0534c is not
correct for the case where `b` has some keys that are not in `a`.
By ensuring their key arrays are same length, we can preserve optimisation and
be correct as well.
Fixes https://github.com/vector-im/element-web/issues/16514
Fixes https://github.com/vector-im/riot-web/issues/14799
We were checking to see if the tags were visible at render time, but we needed to ensure that they were(n't) included when checking for diffs. This introduces a new kind of object cloning for semantic reasons.
This also fixes the selection indicator being a bit off on custom tags.
Previously we were firing updates for everything, which is bad. This has an effect of causing the room list to update itself every time the user goes to toggle some account settings.