API: Sort keys for DataFrame.assign
Closes #9777

Previously the order of new columns from `.assign` was arbitrary. For predictability, we'll sort before inserting.

We need to be comfortable with this change since we can't change behavior later with a keyword arg.

Technically we _could_ allow referencing the a column defined within the same call to `assign` as long as they are sorted. e.g. `df.assign(C=df.A + df.B, D=df.C**2)` would work, but not `df.assign(df.D=df.A +df.B, C=df.D**2)`. But I don't think we should.

cc @mrocklin

:+1:  This looks great to me!
 agreed, you _may_ want to add an example in the docs where you show using _chained_ assignment (if for example you have an evaluation order requirement), .eg.

```
df = DataFrame({A = ..., B = ...})
df.assign(C=df.A+df.B).assign(D=df.C/df.A)
```
 I've got one like that in the warning box

``` python
        (df.assign(C = lambda x: x['A'] + x['B'])
           .assign(D = lambda x: x['A'] + x['C']))
```
 @TomAugspurger small not related note: you pushed your branch to upstream instead of master (no problem for now of course, but we should try to not do that for PRs I think)
 @jorisvandenbossche are you talking about https://github.com/pydata/pandas/commit/f00d6bba5a7ee42569b9d6f7848962fd04a3360d ? I reorganize the whatsnew entry when merging that commit. Or I could be confused about what I did. But I think I pushed this branch to origin.
 no, I was talking about this pr, you apparantly pushed it to upstream (see at the top of the PR, I noticed it because did a `fetch upstream`). But as I said, no problem, it can always happen! Just be sure to delete it after the pr is merged
 @jorisvandenbossche I see what you mean now. Sorry about that. I'll clean it up when this gets merged.

Speaking of which, any objections to merging?
 this looks ok, go ahead and merge
