[PERF] Vectorize select_dtypes
- [x] closes #28317
- [x] tests added / passed (no new tests added, test_dtypes.py, passes locally) 
- [x] passes `black pandas` (passed locally)
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff` (passed locally)
- [x] whatsnew entry
- [x] ASV Benchmark
- [x] final refactoring

I was able to run this code for 10million columns in less than a second, which should solve the mentioned problem sufficiently well. 

<details><summary>ASV Benchmark:</summary>
```
[ 75.00%] ··· frame_methods.SelectDtypes.time_select_dtypes                                                                                                                                               ok
[ 75.00%] ··· ======== =============
                 n
              -------- -------------
                 10      1.53±0.2ms
                100     1.48±0.03ms
                1000    1.50±0.06ms
               10000    1.89±0.04ms
               100000    6.55±0.2ms
              ======== =============

[ 75.00%] · For pandas commit ad9fe5d7 <master^2> (round 2/2):
[ 75.00%] ·· Building for conda-py3.6-Cython-matplotlib-numexpr-numpy-odfpy-openpyxl-pytables-pytest-scipy-sqlalchemy-xlrd-xlsxwriter-xlwt...
[ 75.00%] ·· Benchmarking conda-py3.6-Cython-matplotlib-numexpr-numpy-odfpy-openpyxl-pytables-pytest-scipy-sqlalchemy-xlrd-xlsxwriter-xlwt
[100.00%] ··· frame_methods.SelectDtypes.time_select_dtypes                                                                                                                                               ok
[100.00%] ··· ======== ============
                 n
              -------- ------------
                 10     2.04±0.2ms
                100     10.0±0.3ms
                1000     91.2±2ms
               10000     898±50ms
               100000   8.93±0.08s
              ======== ============

       before           after         ratio
     [ad9fe5d7]       [ef1b9a49]
     <master^2>       <28317-select-dtypes-performance>
-      10.0±0.3ms      1.48±0.03ms     0.15  frame_methods.SelectDtypes.time_select_dtypes(100)
-        91.2±2ms      1.50±0.06ms     0.02  frame_methods.SelectDtypes.time_select_dtypes(1000)
-        898±50ms      1.89±0.04ms     0.00  frame_methods.SelectDtypes.time_select_dtypes(10000)
-      8.93±0.08s       6.55±0.2ms     0.00  frame_methods.SelectDtypes.time_select_dtypes(100000)
```
I hope this is sufficient
</details>