CLN: Make ExcelWriter more pluggable

FIxes #4745 and makes it easier to swap in other `ExcelWriter`s.

Basically, you can subclass `ExcelWriter` (or not), register the engine with `register_engine`, and then either pass it as an `engine` keyword to `read_excel` or set it as the default writer using the config options (i.e., `io.excel.xlsx.writer` or `io.excel.xls.writer`). Engine names are validated by checking that they are already defined and that they are able to read files of that type (that said, if you can set up external config files to be parsed by pandas, this validation should be removed, because it won't work if pandas is loaded before an external dependency [e.g., a plugin that registers a writer class]).  When you call `ExcelWriter`, the metaclass swaps in the appropriate engine class automatically [thereby being backwards compatible].

The great thing is that it should be *really* simple to add additional writers and relatively trivial to add additional readers by following the same format. (if, for example, we wanted to resurrect `openpyxl` for brave souls or something).

Here's the 'interface':

- Mandatory (but not checked at run time):
  - ``write_cells(self, cells, sheet_name=None, startrow=0, startcol=0)``
    --> called to write additional DataFrames to disk
  - ``supported_extensions`` (tuple of supported extensions), used to check
    that engine supports the given extension.
  - ``engine`` - string that gives the engine name. Necessary to
    instantiate class directly and bypass ``ExcelWriterMeta`` engine lookup.
   - ``save(self)`` --> called to save file to disk
- Optional:
  - ``__init__(self, path, **kwargs)`` --> always called with path as first
    argument.
  - ``check_extension(cls, ext)`` --> called to check that the engine supports a
    given extension (and used to validate user selection of engine as option).
    This supercedes ``supported_exceptions``.

You also need to register the class with ``register_engine()``. If you don't subclass ``ExcelWriter``,
you will have to implement ``check_extensions(ext)`` yourself.

There's a tiny bit of metaclass magic to make this backwards-compatible, but it's nothing particularly complicated.