`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?)
Would it be smart to change the flags and helpers kwards to default to None here? They were empty lists before the cacheit was added to this.