ENH: Added code generator logic for innerloop lookup in  generate_umath.py

Implementation
----------------------
* Reduced signature array into distinct types, now <b>32</b> <br/>
E.g These sets (add, subtracts) , (arccos, arcsin, arctan, arcsinh, arccosh) share same signature array
*  For each distinct signature array, auto-gen lookup function having if-else condition which check and return index <br/>
E.g
<pre>
static int input1_id7_index(int x, int y){
	if ( x == NPY_HALF ) { return x+(-23); }
	if ( x >= NPY_FLOAT && x <= NPY_LONGDOUBLE ) { return x+(-10); }
	if ( x == NPY_OBJECT ) { return x+(-13); }
	return -1;
}
</pre>
* Most of binary operations have input of same type, so check for homogeneous inputs first then rests like date, time etc 
* Encapsulates logic, with <code>((PyUFuncObject *)f)->sig_index(arg1, args2)</code>

Improvement
-------------------
<code>PyUFunc_DefaultLegacyInnerLoopSelector</code> now stay below 1%. This save <b>3-4%</b> of time used to be consumed to find proper index by searching to nargs*types array