Command
data class Command(val name: String, val title: String? = null, val description: String? = null, val properties: Set<Property<*>> = emptySet(), val subcommands: Set<Command> = emptySet())
A program can have multiple commands with their own set of options and positional parameters.
TODO Support aliases