`ufuncify` makes actual ufuncs

This PR modifies `ufuncify` to create actual `numpy.ufunc`s.

```
In [1]: from sympy import *

In [2]: a, b, c = symbols('a, b, c')

In [3]: expr = (sin(a) + sqrt(b)*c**2)/2

In [4]: from sympy.utilities.autowrap import ufuncify

In [5]: func = ufuncify((a, b, c), expr)

In [6]: func(1, 2, 3)
Out[6]: 6.7846965230828769

In [7]: func([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], 3)
Out[7]: array([ 11.44343933,  12.36052961,  12.79848207,  13.12159875,  13.75078733])
```

TODO:
- [x] Cleanup code. It's ugly and messy.
- [x] Tests
- [x] Docs
- [x] Optimizations (inline ufunc'ed function call?)
You could use numpy.testing.assert_allclose for these.