REF: move Block.astype implementation to dtypes/cast.py
This moves the `astype` implementation (so the current logic of calling `EA.astype` or `astype_nansafe` depending on the array type, handling datetime and string special cases, handling error keyword, etc) from being defined on `Block` to the `array_algos/` submodule. 

That's a useful clean-up anyway I think (it's not block specific), and this way it can then be reused in ArrayManager.

I currently put it in `core/array_algos/cast.py` since the other similar functions are also put in `array_algos` (`shift`, `putmask`, `replace`, `quantile` etc). But since this is casting specific and we already have most of the underlying pieces in `core/dtypes/cast.py`, could also just put it there (either is fine for me).