REF: maybe_promote refactor/cleanup
There is some casting we currently do in many places in this function.  Instead this PR implements `_ensure_dtype_type` and calls it once at the end of the function.

Removes _check_lossless_cast which can be replaced with np.can_cast