Indicate command-line parse failure with Either instead of error

Aside from being more functionally pure, it lets us indicate the parse
failure right after getting the command-line arguments, instead of
having it swallowed up by Haskell's laziness until we read any text.