Commands are part of a single array, which means that their definition
is static. However, different apps in the same source tree may
reasonably want to add to the command set (perhaps even shadow existing
commands), which would make for awkward code.
Instead, allow dynamic registration/deregistration of command sets at
runtime. This keeps the data overhead low (two pointers per enabled
command set).