See the parent task for the rationale.
Two sub tasks:
- emit a deprecation warning, and later an exception, if ::setExtensionData is called multiple times with the same key and conflicting values
- add an ::appendExtensionData method to allow collecting multiple values.