This adds support for self-recursive message formatters, while maintaining backwards compatibility with old style formatters. After this, each format can be converted to the new style individually and, once they're all converted, a bunch of code can be deleted. These three patches are independent and can be pushed in any order. I put them in a series because pushing them before any formatter rewrites will simplify dependencies between the individual formatter rewrites.