This was not spotted previously, because the base `Attribute` overrides
`Equals()` to have semantics similar to structs (per-field equality) by
using reflection. That masked the issue when strings were used, and
migrating to `LocalisableString` revealed it, as that struct's
implementation of equality currently uses instance checks.
Whether `LocalisableString.Equals()` is the correct implementation may
still be up for discussion, but allowing multiple enumeration is wrong
anyway, since the underlying enumerables are live (one especially is a
yield iterator, causing new object instances to be allocated).
By moving this to a central location, we can avoid invoking the
EditorChangeHandler when there is no selection made. This helps
alleviate the issue pointed out in
https://github.com/ppy/osu/issues/11901, but not fix it completely.