Refactored s3 plugin structure.

This made the s3 plugin follow the design structure for a
CLI plugin. Some features in CLI were changed to enhance
plugins such as changes made in ``BasicCommand`` class.
I think that these new properties should be moved to the base class, and if necessary ported to the other `BaseCLIArgument` subclasses in this module.

The reason for this is that we want subtypes to be replaceable with their base types without altering correctness.  If subtypes have separate interfaces, then anything that takes an "Argument object" will now need to do `getattr` or `isinstance` checks everywhere.  It's more maintainable to have all argument objects have the same interface.