BUG: `take` casting logic with an `out=` argument
When it receives an `out` argument, `np.take` converts the `out` array to
the dtype of the array being taken from. This results in wrong TypeErrors
being raised when `out` has a larger dtype than the array (and not being
raised when it has a smaller dtype, even though they should).

This PR makes an explicit casting check, then either sets NPY_ARRAY_FORCECAST
or raises the error.

The tests added check the logic for conversion between all pairs of ints and
floats only.