CLN/PERF: avoid double-checks
Mostly CLN with a couple of PERF things tacked on at the last minute

1) replace can_hold_element checks with np_can_hold_element checks and only for non-dtlike numpy dtypes.  This avoids double-validating in non-raising cases.

2) Avoid up/downcasting in Block.where no-op cases

```
import numpy as np
import pandas as pd

df = pd.DataFrame(range(10**6), dtype=np.int32)
mask = np.ones(df.shape, dtype=bool)

%timeit res = df.where(mask, -1)
7.69 ms ± 13.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)  # <- master
1.31 ms ± 104 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <- PR
```
@meeseeksdev backport 1.4.x Something went wrong ... Please have a look at my logs.