`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.
Don't use new assumptions in the sets module
Implement a symbolic object for the relation "is an element of"

1. fixes #6194
2. contains methods of set classes were modified to return
   BooleanAtom's, not True/False
Printing support for Contains class
Fix some asserts to check if foo.contains(bar) is S.true
Remove .is_infinitesimal assumption
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
Merge pull request #7989 from skirpichev/contains

Implement a symbolic object for the relation "is an element of"
Merge pull request #7995 from skirpichev/remove-is_infinitesimal

Remove .is_infinitesimal assumption
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