BUG: MaskedArray._quantile match non-nullable behavior
- [ ] closes #xxxx (Replace xxxx with the Github issue number)
- [ ] [Tests added and passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#writing-tests) if fixing a bug or adding a new feature
- [ ] All [code checks passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit).
- [ ] Added an entry in the latest `doc/source/whatsnew/vX.X.X.rst` file if fixing a bug or adding a new feature.

Along with some refactors to 1) de-duplicate squeeze/unsqueeze logic and 2) avoid densifying Sparse

cc @attack68 the edits to the Styler tests are pure guess-and-check to keep the tests passing.  Can you confirm that they make sense?  Maybe suggest a more idiomatic way of expressing the conditions in which to pop?
at first glance it seems that this changes the basic operation.

In the styler tests the dataframe is:

```python
     A    B
0    0    1
1  nan None
2   10    2
```

In the test you have added a highlighted cell in (0,1), and pop it based on other parameters.

Under the base "float64" case when `q_left=0.5` and `q_right=1`, and `axis=0` the `None` value is column B seems to be interpreted as an element (possibly 0) and then {1,2} fall within the quantile, whereas for column A nan is either not interpreted as a value (or 0) and then only {10} falls in the quantile.

On the other hand when axis is `None` only {2, 10} fall within the quantile, suggesting that `nan` and `None` are not evaluated as 0 since otherwise {1} would also be in the quantile.

So, at first glance this seems to give different, non-intuitive values. I will take a closer look later. This pull request is stale because it has been open for thirty days with no activity. Please [update](https://pandas.pydata.org/pandas-docs/stable/development/contributing.html#updating-your-pull-request) and respond to this comment if you're still interested in working on this. @jbrockmendel can you merge master rebased + green