For {T185709}, we cannot just store `Message` objects – the parameters which we pass to our messages contain entity labels, which are already language-specific. We need something more at the `ConstraintParameterRenderer` level: a message object with parameter types like “string”, “entity ID”, “list of item IDs”. Only when the message is finally rendered do we pass those parameters into, say, an `$entityIdLabelFormatter`.
This also means one less object to inject into all checkers: the checkers will instantiate such a message, which is a pure value object, and the task of rendering it is then delayed until the `CheckConstraints` API or `SpecialConstraintReport`, which means that the checkers no longer need a `ConstraintParameterRenderer`.
#patch-for-review:
- [x] [`ViolationMessage`](https://gerrit.wikimedia.org/r/406294)
- [x] [`ViolationMessageRenderer`](https://gerrit.wikimedia.org/r/406295)
- [x] [`ViolationMessage` in `CheckResult`](https://gerrit.wikimedia.org/r/406296)
- [x] [default `null`](https://gerrit.wikimedia.org/r/406297)
- [x] [messages without arguments](https://gerrit.wikimedia.org/r/406298)
- [x] [entity ID arguments](https://gerrit.wikimedia.org/r/406568)
- [x] [messages with such arguments](https://gerrit.wikimedia.org/r/406569)
- [x] [entity ID list arguments](https://gerrit.wikimedia.org/r/406834)
- [x] [messages with such arguments](https://gerrit.wikimedia.org/r/406835)
- [ ] minor test changes [1](https://gerrit.wikimedia.org/r/406991), [2](https://gerrit.wikimedia.org/r/406992), [3](https://gerrit.wikimedia.org/r/406993)
- [ ] [`ItemIdSnakValue` arguments](https://gerrit.wikimedia.org/r/406994)
- [ ] [messages with such arguments](https://gerrit.wikimedia.org/r/407000)
- [ ] [minor: remove unused parameters](https://gerrit.wikimedia.org/r/407001)
- to be continued…