Numpy ufuncs proof of concept

This pull request contains the modifications to make type inference for numpy ufuncs based on NumPy semantics of ufuncs.

Note that when an output array is passed as an argument to the ufunc, type inference does nothing, as the result type will be the same as the output array. Note that it would be possible to provide TypingErrors for cases where no loop of such ufunc exists that can be executed.

Type inference works by taking the loops of the ufuncs and finding the first one that can be executed on the sources. Type inference will return the output type for the loop as its result.

In order to support this, a couple of functions are added in numpy_support that allow mapping from NumPy letter types as used in the ufunc loop descriptor to numba types, and back.

The pull request also includes some refactor of the ufunc tests, to reduce boilerplate, as well as a small fix to numba.types, to make uintc unsigned (it was declared as signed, which caused problems in the numpy->numba type mapping described before).