PERF: optimize conversion from boolean Arrow array to masked BooleanArray
For arrays without missing values it doesn't change, but gives a decent speed-up when having missing values:

```
In [1]: arr1 = pa.array([True, False, True, True, False]*100_000)

In [2]: arr2 = pa.array([True, False, None, True, False]*100_000)

In [3]: %timeit pd.BooleanDtype().__from_arrow__(arr1)
9.34 ms ± 27.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)   <-- master
9.31 ms ± 23.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)   <-- PR

In [4]: %timeit pd.BooleanDtype().__from_arrow__(arr2)
60.6 ms ± 678 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)   <-- master
18.8 ms ± 99.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)   <-- PR
```

cc @simonjayhawkins 
@jorisvandenbossche i'm getting significant different timings and showing a much bigger improvement (30x with missing values) and same with `* 1_000_000`. can you double check you timings.

```
%timeit pd.BooleanDtype().__from_arrow__(arr1)
# 572 µs ± 4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  <-- master
# 553 µs ± 2.91 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)   <-- PR

%timeit pd.BooleanDtype().__from_arrow__(arr2)
# 34.4 ms ± 373 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)   <-- master
# 1.06 ms ± 2.35 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)   <-- PR
``` > i'm getting significant different timings and showing a much bigger improvement (30x with missing values) 

Whoops, I was using my debug build of arrow, which makes things generally much slower, that should explain it. 
But so all the better that the speed-up is larger! ;) @simonjayhawkins any further comments? Will add a small note