_download: Exception != OSError

Cut-and-paste context error.  Here we specifically want OSError to
dereference e.errno.  If we get a different type of error, we should
raise that separately until we know how to deal with it.

I did see one example of an S3Error getting raised here, syncing down
a bucket that has versioning enabled but one file deleted.  We have to
first fix this error to debug the next error.
_download: handle S3Error

If we get an S3Error here (i.e. HTTP 404 Not Found), warn and continue
rather than crashing.  This can happen if the file is removed from S3
async to us running, after having retrieved the directory listing from S3.