Add support for math functions in eval()
closes #4893

Extends the eval parser to accept calling math functions.

looks good. can you add a whatsnew note in 0.17.0 docs. pls squash as well. ping when green.
 once I merged this: https://github.com/pydata/pandas/pull/10975 (or you can rebase on top)

pls update the tests as you indicated 
 @sklam can you update the tests
 @sklam can you update
 hmm, it appears `numexpr` automatically upcasts complex64 -> complex128?
is that a bug? or in the spec?

```
In [1]: df = DataFrame({'a': np.random.randn(10).astype(np.complex64)})

In [2]: df.dtypes
Out[2]: 
a    complex64
dtype: object

In [3]: df.eval('b = sin(a)')

In [4]: df
Out[4]: 
                a                     b
0  (-0.570414+0j)  (-0.539980304291+0j)
1   (0.623834+0j)   (0.584150916712+0j)
2     (1.6842+0j)   (0.993577225836-0j)
3    (1.54063+0j)   (0.999545174164+0j)
4   (0.788171+0j)   (0.709064831257+0j)
5  (-0.916847+0j)  (-0.793687403046+0j)
6   (0.775991+0j)   (0.700423483759+0j)
7  (-0.654412+0j)  (-0.608692614148+0j)
8   (-1.62652+0j)  (-0.998447583421-0j)
9   (0.152154+0j)   (0.151567580954+0j)

In [5]: df.dtypes
Out[5]: 
a     complex64
b    complex128
dtype: object
```
 thanks @sklam 
