add S3/ExitCodes, use them in all sys.exit() calls.

Beginning the process of returning useful exit codes.  First we
add the ExitCodes themselves, and start using them in sys.exit() calls
throughout for consistency.

Some are still a little weird, like returning EX_SOFTWARE when a
request to move a file results in an S3Error(NoSuchKey).  It's not
really a software failure, it's arguably a user input failure.  But to
fix it we have to catch the S3Error lower down, and raise a
ParameterError or similar.

None of the commands (put, get, sync, ...) yet return any status code,
so main() always exits with EX_OK when it runs to completion.
Add exit return codes for all primary commands

Commands now return some form of return code, which then shows up as
the s3cmd process exit code.  If an S3Error is raised, we return
EX_SOFTWARE and hope the point where it was raised also output enough
error() messaging to understand what failed.
more exception catching leaving main()

If one of our commands failed to return a meaningful
return code, exit with EX_GENERAL.

If one of our commands raised a retryable exception (e.g. try again
later), capture that and don't traceback.  This will cut down on the
number of bug reports for "try again later" responses.

Clearly report non-specific S3Error, S3Exception, and related failures
with a traceback.
Merge branch 'bug/exitcodes' into exitcode-merge

Conflicts:
	s3cmd