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).
There are 3 modes: enabled, limited, and disabled.
The limited mode hides identifiable information such as username, rank, and
(if participating in one) multiplayer lobby name.