Experimenting with more structured ways to handle command-line input/output in Rust

Refactor how `Group` stores messages

Migrate from a map between locales and their messages to a table where each row heading is the locale, each column heading is the canonical message and each cell is an Option<Message>. This reduces unnecessary work and makes it much cleaner to query all localizations of a message (.is_some() for each row in the column for that message id).

Created by  finchie  on February 24, 2024
BQ6N55O7RPG47G35YI37Z37456VKWT5KLGQKDQVAN2WI4K34TRBQC
Change contents