Use polymorphic types for options
Improved type-safety of options handling

It is now a compile-time error if a command fails to handle an option it
claims to support.