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).

This will turn 'm' and 'M' into 'D', which is double-precision complex. It seems you really want to turn them into 'm8[d]' and 'M8[D]', respectively.