CLN: Simplify Block._astype
There's lots of nested logic there (plus 1 more level from https://github.com/pandas-dev/pandas/pull/22343). Would be good to simplify this.

The components:

1. argument validation (could maybe do this elsewhere, not a big deal)
2. astyping *to* categorical is special cased. We'll want to remove that in favor of a generic astype system
3. Determine target_dtype -> Block type
4. `_astype` currently takes a `values` argument, which complicates things. Why is that? Why isn't it just `self.values` always?