EA: BoolArray
this builds on #22226 and #22238 by @WillAyd  and the ``ArrowBoolArray`` by @TomAugspurger to create a first class bool array that is backed by a numpy EA array or a pyarrow array if available. Uses this MaskArray as the mask inside IntegerArray. The is a POC to see how feasible this is generally. Note that I did this with ``bitarray`` as well, but this is more general purpose / forward looking.

Some decent memory savings as the bits are packed by arrow.

PR:
```
In [2]: s = pd.Series(np.arange(100000), dtype='Int64')                                                                                                                                                                                 

In [3]: s.nbytes                                                                                                                                                                                                                        
Out[3]: 812500

In [4]: s._values._mask.nbytes                                                                                                                                                                                                          
Out[4]: 12500
```

0.24.1 / master
```
In [2]: s = pd.Series(np.arange(100000), dtype='Int64')                                                                                                                                                                                 

In [3]: s.nbytes                                                                                                                                                                                                                        
Out[3]: 900000

In [4]: s._values._mask.nbytes                                                                                                                                                                                                          
Out[4]: 100000
```

TODO:
- [x] ``pyarrow`` uses ``pandas`` as a dependency, so we have a hoop to jump to actually have this import in a sane way
- [ ] we need a ``pd.bool_`` dtype to avoid exposing the pyarrow dtypes directly (mainly because we have this as an optional dep and now BoolArray can either be ``np.bool_`` or ``arrow_bool`` so need a single type to expose to end users; this is not hard just not done).
- [x] The ``BoolArray`` allows NaN's when its an ArrowBoolArray but not for a NumpyBoolArray; I avoided this entirely but just using this as a masking array (so its guaranteed as only bool types), but eventually want to allow this
- [ ] A number of missing methods on ArrowBoolArray that we should push upstream (implemented now by simply coercing and using numpy)
- [x] ~Should just rename ``MaskArray`` to ``BoolArray`` I think.~ This is now internal only, ``BoolArray`` will use this.

cc @pandas-dev/pandas-core 