`ufuncify` makes actual ufuncs

This is a rough pass at getting ufuncify to make actual ufuncs. It
works, but needs some cleanup, optimizations, tests, and documentation.
Ufuncify backends, code cleanups

- Brought back backends for F2Py and Cython. These now support
  broadcasting on all arguments, but mandate that the arguments be
  1-dimensional arrays of the same length.
- Default backend is the new `numpy` backend, which creates actual
  `ufunc`s.
- Code cleanups, improved docstrings, added tests.
Codewrappers infer/validate language from backend

In `autowrap` and `ufuncify`, the `language` kwarg now defaults to
`None`. In this state, the language is inferred from a lookup table of
backend -> tuple of languages, with the highest preference first. If the
language is specified, it is validated using this same lookup. This
prevents specifying `backend='f2py', language='c'`, and also allows the
user to only specify the backend to change behavior.

Also made some touchups to docstrings and tests.
Merge remote-tracking branch 'upstream/master' into ufuncify_improvements

Conflicts:
	sympy/utilities/autowrap.py
Cache calls to `ufuncify`

- `ufuncify` is not cached
- Small fix to `autowrap` docstring
fix is_zero detection on Mul._eval_is_* tests

Once a None is obtained for is_zero, it should no longer be updated.
The return value must consider the value of is_zero. This can
change if S.Zero.is_imaginary = S.Zero.is_real = True is ever true.

The routines were shortened a bit, too.
Small improvments for Mul._eval_is_real/imaginary

1. removed fuzzy_not import (it's redundant)
2. slight formatting changes
3. add an early exit if t is not a complex number
4. renamed: is_zero -> zero (like the real variable)
5. simplify "if real and is_zero is False" branch of _eval_is_real
Make Mul._eval_is_hermitian/antihermitian like Mul._eval_is_real/imaginary
Change is_integer/positive/real to _evals_is_* helpers
add Mul.is_nonzero handling
revert complex handling in Mul._eval_is_(real|imaginary)
fix Mul._eval_is_imaginary
simplify Mul.is_imaginary routine
clean up tests
simplify Mul.is_antihermitian routine
affirm some basic assumptions wrt real/imag/complex
add quick exit if factors are not complex
restore quick exit at end of loop
add bounded checking for Mul.is_nonzero
fix Mul.is_zero

>>> from sympy import *
>>> oo.is_bounded
False
>>> oo*0
nan
>>> _.is_zero
>>> var('z', nonzero=False)
z
>>> z.is_zero
True
>>> (oo*z).is_zero  # this is wrong
True
>>> (oo*z)._eval_is_zero()  # but this is right