Rework the command loader to be as lazy as possible

Commands are defined in a mini-DSL that specifies their CLI name (what
you type after `chef` in bash to invoke that subcommand), their class
name, the path to require to load them, and a short description. This
minimizes the amount of code we need to load to invoke any CLI command
so that command latency is minimized.
Add trap for interrupt as early as possible in the CLI