Break apart internal and CLI errors

The Cargo library now uses internal errors to represent problems, and
the operations convert those errors into CLIErrors, which contain a
user-friendly error message, additional information for verbose mode,
and an exit code.