API: multi-line, not inplace eval
closes #9297
closes #8664

This is just a proof of concept at this point - the idea is to allow multiple assignments within an eval block, and also include an `inplace` argument (currently default True to match old behavior, although maybe that should be changed) for chaining.

```
In [15]: df = pd.DataFrame({'a': np.linspace(0, 100), 'b': range(50)})

In [16]: df.eval("""
    ...: c = a * 2
    ...: d = c / 2.0
    ...: e = a + b + c""")

In [17]: df.head()
Out[17]: 
        a  b          c         d          e
0  0.000000  0   0.000000  0.000000   0.000000
1  2.040816  1   4.081633  2.040816   7.122449
2  4.081633  2   8.163265  4.081633  14.244898
3  6.122449  3  12.244898  6.122449  21.367347
4  8.163265  4  16.326531  8.163265  28.489796

In [18]: df.eval("""
    ...: f = e * 2
    ...: g = f * 1.5""", inplace=False).head()
Out[18]: 
        a  b          c         d          e          f          g
0  0.000000  0   0.000000  0.000000   0.000000   0.000000   0.000000
1  2.040816  1   4.081633  2.040816   7.122449  14.244898  21.367347
2  4.081633  2   8.163265  4.081633  14.244898  28.489796  42.734694
3  6.122449  3  12.244898  6.122449  21.367347  42.734694  64.102041
4  8.163265  4  16.326531  8.163265  28.489796  56.979592  85.469388
```

@chris-b1 this looks reasonable. I think that we _should_ change the `inplace` to `False` by default. That obviously is a breaking change. So what I think we could do is this:

make `inplace=None` the default
detect if an assignment is being made. if `inplace` is `None`, then show a deprecation warning.
this implicity makes `inplace=None` -> `inplace=False` for non-assignments (which is what it currently does, and is quite reasonable). To get inplace then assignment you would have to be explict about passing `inplace=True`, which is what we would want.

yes?
 cc @shoyer 
 Yes, this looks great!

I agree that we should change the default behavior to `inplace=True` in a version or two. I think @jreback has the right idea on the migration path.
 @chris-b1 going to mark this for 0.18.0 as putting the deprecation warning in-place (pun intended)
 @chris-b1 want to update / add in deprecation warning as discussed
 @jreback - this is updated - added a whatsnew and deprecation warnings.
 pls review the eval docs for any updates (in enhancingperf.rst)
 does this handle #8664  ?
 @jreback 
Updated the enhancingperf docs, and added a fix/test for #8664
 lgtm. couple of doc changes. squash & ping when green.
 @jreback - updated and green
 very tiny doc change. ping when pushed.
 can you run: `git diff master | flake8 --diff` and fix anything. going to shortly be enforcing PEP8.
 Updated for your doc comment and PEP8 - nothing major but did have to add a couple `# noqa` where a name was only used in an eval block - is that the right approach?
 merged via https://github.com/pydata/pandas/commit/99c2d932c8c3e86e2311f525b412e2e335dbe6a2

thanks for the nice changes!

yeh the `# noqa` is fine (I took one out, but otherwise ok).
