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/.
I'm open to doing that, but one small thing is preventing it. When we set an error (`res.SetError`), we specify an error type, currently either `ErrClient` (errors caused by the user) or `ErrNormal` (other errors).

Distinguishing between the two types is important, for instance on the CLI we only need to show the command help text for `ErrClient`, and on HTTP we use this to know what HTTP status code to send.