ENH: support Styler in ExcelFormatter
Pandas is a nice way to export data from Python to Excel.  It even has an internal representation of Excel cell styling.  It also has a data-driven framework for styling Pandas dataframes with CSS.

This PR connects those features together in a rudimentary and experimental way, for advanced users only.  It allows `ExcelFormatter` to accept a `Styler` in place of a `DataFrame` and to provide a `style_converter` callback for conversion from CSS styles to the styles understood by `ExcelWriter`.

While I acknowledge that I am extending a hidden feature (to make it more usable) and that high-coverage conversion of CSS to Excel styles is no small feat so ?all prospective usages will be a hack, I would enjoy using this feature and think others would too.


I wasn't sure how to test this as no tests directly instantiate `ExcelFormatter`. (I could of course alter the `to_excel` parameters to provide the new feature, but I thought it might best remain hidden. WDYT?)

A test follows:
```python

import pandas as pd
from pandas.formats.format import ExcelFormatter


def test_style_converter():
    df = pd.DataFrame({'a': list(range(3))})

    header_style = '!unset'
    # default Styler provided
    formatter = ExcelFormatter(df)
    for cell in formatter.get_formatted_cells():
        if cell.row < 1 or cell.col < 1:
            if header_style == '!unset':
                header_style = cell.style
                assert header_style is not None
            else:
                assert cell.style == header_style
        else:
            assert cell.style is None

    styler = df.style.background_gradient(cmap='Greys', low=.5, high=0)
    expected = ['c6c6c6', '686868', '000000']
    formatter = ExcelFormatter(styler)
    for cell in formatter.get_formatted_cells():
        if cell.row < 1 or cell.col < 1:
            assert cell.style is header_style
        else:
            assert cell.style == {'fill': {'fgColor': expected[cell.row - 1],
                                           'patternType': 'solid'}}

    styler.to_excel('/tmp/out.xlsx', engine='openpyxl')
    with open('/tmp/out.html', 'w') as f:
        f.write(styler.render())

```

 - [x] closes #1663
 - [x] tests added / passed
 - [x] passes ``git diff upstream/master | flake8 --diff``
 - [x] whatsnew entry
