improve type inference for ufuncs

Made changes so that typeinference for ufunc fails for types not supported in ufunc kernels code generation. This is to avoid type inference succeeding when there is no appropriate lowering function for the ufunc, which would cause a lowering error (which won't trigger compilation in object mode, meaning that jit may fail for code the could be compiled using object mode).

Also tried to improve the TypingError messages for ufuncs.

New stress tests to make sure code generation for each supported ufunc loop is covered (quite slow).

Extra functions imported in npymath submodule (in preparation of complex support in ufuncs).

There is np.modf(), which returns the fractional and integral parts of each element in separate arrays.  That's the only one I was able to find in the list of numpy math functions.