CLN: clean color selection in _matplotlib/style
- [ ] closes #xxxx
- [ ] tests added / passed
- [ ] passes `black pandas`
- [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

There was a comment in the top of the module that the code was a bit too dynamic.
The logic in the function was too complex.

I refactored the code
 - Extract functions
 - Simplify logic
 - Add type annotations

Note: there is one issue with mypy, which I do not know how to handle. Currently I suggested to ignore the error.
Here is a problem. I want to install Cycler (https://matplotlib.org/cycler/) for testing purposes, to mimic matplotlib behavior on default color selection. When I add it into ``environment.yml``, it is rejected by pre-commit check. Moreover, it seems that this package is never installed anyway, which leads to the failure of the tests requiring Cycler. I have some weird problem with the new test module ``test_style.py``. It works fine in my local virtual environment, but fails in CI (some importing problem).

```
_____________ ERROR collecting pandas/tests/plotting/test_style.py _____________
ImportError while importing test module '/home/vsts/work/1/s/pandas/tests/plotting/test_style.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../../../miniconda3/envs/pandas-dev/lib/python3.7/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
pandas/tests/plotting/test_style.py:5: in <module>
    from pandas.plotting._matplotlib.style import get_standard_colors
pandas/plotting/_matplotlib/__init__.py:3: in <module>
    from pandas.plotting._matplotlib.boxplot import (
pandas/plotting/_matplotlib/boxplot.py:5: in <module>
    from matplotlib.artist import setp
E   ModuleNotFoundError: No module named 'matplotlib'
``` All checks are good except Windows py38_np18, where tests related to numba failed. I guess it is irrelevant of my changes. cc @charlesdong1991 
 I checked that we actually can use cycler.
But the problem is that tests must be changed.
Currently it is acceptable to return more colors that ``num_colors``.

When I use cycler I would prefer to keep only required number of colors:

```
def _cycle_colors(colors: List[Color], num_colors: int) -> Iterator[Color]:
    import matplotlib.pyplot as plt

    cycle = plt.cycler(color=colors)
    for _, item in zip(range(num_colors), cycle()):
        yield item["color"]

```

This looks simple to understand, IMHO.
And it seems more reasonable that we return exactly ``num_colors`` colors, without any extra (although extra colors are ignored anyway).
But are we good that I go ahead and change some tests?
Or maybe leave it to another PR?

@jreback  thanks @ivanovmg very nice