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

It would make sense, yes. And overall, I think medium term we should make efforts to improve error messages, as well as testing that things fail in an expected way, not only that it works in the supported cases.