CLN: Styler Types for CSS variables on `ctx` object. 
State: closed

- [x] tests changed / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#code-standards) for how to run them

`Styler` currently has three formats for keeping track of CSS:

 A) `CSSList type: [('a1', 'v1'), ('a2', 'v2')]`
 B) `List[str] type: ['a1:v1', 'a2:v2']`
 C) `Str type: 'a1:v1; a2:v2;'`

`C` is only ever used as user input format, and now, as of #39564 `C` can be used in *all* cases for user input (albeit `A` remains available for backwards compatibility in `.set_table_styles()`)

`A` remains the most algorithimcally accessible, and is what `C` is already converted to in some cases for internal variables.

`B` is only ever used by one internal variable. The `ctx` object is updated with `B` type converted from `C`. For final render this `B` type is converted to `A` type for looping. In the process, white space is poorly handled.

This PR eliminates `B` type and converts `C` directly to `A`. 

Tests using the `ctx` object needed updating for new type.


Labels:
name: Clean
name: Typing
description: type annotations, mypy/pyright type checking
name: Styler
description: conditional formatting using DataFrame.style

Comments:
looks reasonable. is there any user facing change here?
@jreback shouldn't have any user facing changes. `ctx` is internal variable, never referenced in docs - no one should be accessing it directly.

A quick question if you have time: what is the style guideline for `private` and `public` class attributes? There are a few in `Styler` that really are private mechanics only but no leading underscore in the name? 
> @jreback shouldn't have any user facing changes. `ctx` is internal variable, never referenced in docs - no one should be accessing it directly.
> 
> A quick question if you have time: what is the style guideline for `private` and `public` class attributes? There are a few in `Styler` that really are private mechanics only but no leading underscore in the name?

the entire module *should* be private as pandas.core is indicated as private. Generally leading underscores are useful to indicate that this function is not used *outside* of the module. But wouldn't simply change things as that causes huge diffs for no reason.
> looks reasonable. is there any user facing change here?

ah I just thought of a change (demonstrated by the what_new_0.20.0 file). If the user has code which generated bad-css that was previously silently ignored, it will now raise an error. maybe we need a call on whether raising or silently ignoring is better??
```
[ 58.33%] ··· io.style.RenderApply.peakmem_apply                                                                                                                              ok
[ 58.33%] ··· ====== ======= =======
              --           rows     
              ------ ---------------
               cols     12     120  
              ====== ======= =======
                12    77.9M   77.7M 
                24    77.7M   77.7M 
                36    77.9M   77.7M 
              ====== ======= =======

[ 66.67%] ··· io.style.RenderApply.peakmem_render                                                                                                                             ok
[ 66.67%] ··· ====== ======= =======
              --           rows     
              ------ ---------------
               cols     12     120  
              ====== ======= =======
                12     78M    79.4M 
                24    77.9M   80.1M 
                36    78.3M   82.2M 
              ====== ======= =======

[ 75.00%] ··· io.style.RenderApply.time_render                                                                                                                                ok
[ 75.00%] ··· ====== ============ ==========
              --               rows         
              ------ -----------------------
               cols       12         120    
              ====== ============ ==========
                12    12.0±0.1ms   86.7±1ms 
                24    31.2±0.4ms   159±3ms  
                36    46.7±0.3ms   237±3ms  
              ====== ============ ==========

[ 75.00%] · For pandas commit 407e67c1 (round 2/2):
[ 75.00%] ·· Building for virtualenv-py3.8-Cython0.29.21-jinja2-matplotlib-numba-numexpr-numpy-odfpy-openpyxl-pytest-scipy-sqlalchemy-tables-xlrd-xlsxwriter-xlwt...
[ 75.00%] ·· Benchmarking virtualenv-py3.8-Cython0.29.21-jinja2-matplotlib-numba-numexpr-numpy-odfpy-openpyxl-pytest-scipy-sqlalchemy-tables-xlrd-xlsxwriter-xlwt
[ 83.33%] ··· io.style.RenderApply.peakmem_apply                                                                                                                              ok
[ 83.33%] ··· ====== ======= =======
              --           rows     
              ------ ---------------
               cols     12     120  
              ====== ======= =======
                12    77.9M   77.8M 
                24    77.6M   77.8M 
                36    77.9M   77.6M 
              ====== ======= =======

[ 91.67%] ··· io.style.RenderApply.peakmem_render                                                                                                                             ok
[ 91.67%] ··· ====== ======= =======
              --           rows     
              ------ ---------------
               cols     12     120  
              ====== ======= =======
                12     78M    78.8M 
                24    78.1M   80.8M 
                36    78.2M   82.3M 
              ====== ======= =======

[100.00%] ··· io.style.RenderApply.time_render                                                                                                                                ok
[100.00%] ··· ====== ============ ==========
              --               rows         
              ------ -----------------------
               cols       12         120    
              ====== ============ ==========
                12    12.8±0.8ms   88.0±2ms 
                24    50.4±10ms    161±3ms  
                36     46.4±1ms    240±8ms  
              ====== ============ ==========
```


**BENCHMARKS NOT SIGNIFICANTLY CHANGED.**

thanks @attack68 
Hi, when styling Excel sheets (using `xlsxwriter`), number formats can be passed in to stylers using the `number-format` CSS attribute, that's than picked up by the Excel engine to apply.

It's common for these formats to include one, or multiple, semicolons since this is how Excel defines styles for positive/negative numbers (ie. `number-format: 0_);[Red](0)`). In pandas 1.2.x the previous example worked fine, however it seems to have broken in 1.3.x. Looking through the changelog I have found this PR and it seems one of the changes made here has caused this, though unsure what exactly. Any pointers would be greatly appreciated.

For now my processes will be pinned on pandas 1.2.x, but would love to look into how this could be fixed. Thanks