refactored a bit ufuncs based on a dict.

Moved the dicts to a different file. The idea is making it
easier to implement them, as well as making them accessible to
type inference.
make typeinfer fail when a given loop is not supported

using the new ufunc_db, it uses information about supported loops
to raise a TypingError if a given loop is not supported. This is done
only for ufuncs relying in the ufunc_db for lowering, for the rest, a
type based mechanism is used (the one used before). The ufunc_db method
allows for a more fine grained specification.
minimized dependencies to import the ufunc_db symbol

The DB initializes lazily now.
prefer relative imports
tentative support for complex in np.negative
Merge remote-tracking branch 'origin/npymath-complex' into npymath-complex-keepworking

Conflicts:
	numba/numpy_support.py
	numba/typing/npydecl.py
remove dead elif in typeof_expr()
Developer documentation for adding type inference information
remove unneeded top table of contents in "extending frontend" doc
document template registry
Merge remote-tracking branch 'origin/master' into npymath-complex

Conflicts:
	numba/typing/context.py
dropped supported_letter_types function

also cleaned up comments
fixed numba_types_to_numpy_letter_types
tests for complex ufuncs
support for complex in add ufunc
support for complex in np.subtract
complex support for numpy.multiply ufunc
(legacy) divide ufunc using the ufunc_db
change builtin_intrinsic to builtin in dev docs to match actual Numba usage
(legacy) division implemented using ufunc_db

It works with all number types, including complex.