ENH: accept dict of column:dtype as dtype argument in DataFrame.astype
Continued in https://github.com/pydata/pandas/pull/13375

---

closes #7271

By passing a dict of {column name/column index: dtype}, multiple columns can be cast to different data types in a single command. Now users can do:

`df = df.astype({'my_bool', 'bool', 'my_int': 'int'})`

or:

`df = df.astype({0, 'bool', 1: 'int'})`

instead of:

```
df['my_bool'] = df.my_bool.astype('bool')
df['my_int'] = df.my_int.astype('int')
```

astype currently has the `copy` kw. This is a big bogus as this almost always actually does copy if its changing to a new dtype (the exception is when its going to the same dtype).

related to #5769. It think we should change this to `inplace` (and deprecate `copy`) as its a bit more clear whats actually going on.

This could be done in another PR (before this one), or in this one is ok too.
 further I wouldn't use `.ix` here as that would interpret numeric values as positional indexers for columns as this is a potentially confusing situation (and we don't do this anywhere else). If a non-matching column is passed then it will simply raise a `KeyError`. Instead use `[]`.

So pls add some more tests, including some invalid columns.
 @StephenKappel can you rebase/update
 @StephenKappel can you rebase / update
 Sorry for neglecting this. The semester is finally over, so I'll get this cleaned up today :-)
 @jreback - Rebased and updated based on your earlier feedback. Please let me know if any further updates are needed.
 ## [Current coverage](https://codecov.io/gh/pydata/pandas/pull/12086?src=pr) is **84.15%**

> Merging [#12086](https://codecov.io/gh/pydata/pandas/pull/12086?src=pr) into [master](https://codecov.io/gh/pydata/pandas/branch/master?src=pr) will increase coverage by **<.01%**

``` diff
@@             master     #12086   diff @@
==========================================
  Files           137        137          
  Lines         50287      50309    +22   
  Methods           0          0          
  Messages          0          0          
  Branches          0          0          
==========================================
+ Hits          42311      42333    +22   
  Misses         7976       7976          
  Partials          0          0          
```

> Powered by [Codecov](https://codecov.io?src=pr). Last updated by [af7bdd3...0ac5354](https://codecov.io/gh/pydata/pandas/compare/af7bdd3883c8d61e9d9388d3aa699930eee7fff8...0ac535454f50784e1c35bc651eacf03ac48815d3)
 can you rebase / update?
 Ahh. Not sure how, but rebasing added everyone else's commits to this diff. Closing this PR and opening a clean one.
 you don't need to make a new PR just rebase and force push 
 I created a clean branch off of prod, cherry-picked my commits, and force pushed to this branch, but for some reason GitHub isn't recognizing it. Perhaps it's because I already closed the PR? But, I don't think I have access to reopen the PR...
 Oh. It seems the PR can't be reopened because the branch has been subsequently force pushed :-(
