At the point when a system block is created, a blocker is usually set using the 'byText' constructor option. A User object is built from this in AbstractBlock::setBlocker, which requires the text either to be a local user name or to be present in $wgReservedUsernames.
Some system blocks use a translated message as the user name. One disadvantage of this is that the message key must be reserved (the reserved username is translation-dependent - see User::isUsableName). Another disadvantage is that the message might be translated before the User is initialized (see T227007). Others use the English string 'Mediawiki default', perhaps to avoid registering another reserved username. Using an English string is disadvantageous for localization.
Why does the blocker need to be a User? AbstractBlock::setBlocker sets the $blocker property. AbstractBlock::getBlocker is rarely used outside the block classes; within them, it is used by AbstractBlock::getBy and AbstractBlock::getByName which call the User methods to get the blocker's ID and name respectively. These two methods are used in a few places, often related to reporting block errors.
It may be better to stop requiring that the blocker of a SystemBlock be a User. The $blocker property could be moved to DatabaseBlock, while AbstractBlock::getBy and AbstractBlock::getByName could be overridden in SystemBlock to return 0 and whatever was passed in as the 'byText' option for backwards compatibility (this is the same as their current return values).
This would allow 'byText' to be a message key, which could be translated when needed.