Commands Refactor Part 2

We split #196 in two parts. this is the second. (#262 is the first). This builds on all the changes to commands/.
this handling of errors is not clear at all. errors should be handled in succession. i.e. it's not obvious to the reader what happens if req or root are nil down below. 

suggestion: move the printing out of the parse error into a function. and then handle (a) no command errors, and (b) option errors individually:

```Go
func handleCliParseError(...) {
  ...
}


// here
req, root, cmd, path, err := cmdsCli.Parse(args, Root, commands.Root)
if err != nil { // no command error
  // no command error-specific stuff.
  return handleCliParseError(...)
}

// this shouldn't happen here, correct?
if req != nil && root != nil {
  panic("req or root nil. shouldn't happen here")
}

options, err := getOptions(req, root)
if err2 != nil {
  fmt.Println(err2)
  exit(1)
}

// what's the other condition for handleCliParseError?
```