Migrate command module to dataclasses
Note that some conceptually abstract classes, such as CommandSuccess,
can still be instantiated directly, but that was already the case
before. It looks like there’s not really a great way to ensure that
they’re not instantiated without having an abstract method.