Add support for structured array ufuncs

- Add New api method PyUFunc_RegisterLoopForStructType for creating new ufunc for structured array
- Add arg_dtypes array to PyUFunc_Loop1d object. This keeps track of each struct dtype that the ufunc can handle.
- Add arg_dtypes parameter to ufunc_loop_matches function so that struct dtypes can be compared for NPY_VOID type num
Add comments for new RegisterLoopForStructType API method
Fix build error
Code cleanup
Add test for struct array ufuncs
Add support for python 3
Update c-api documentation
Change free to PyArray_free, and formatting changes
Whitespace change
Remove unneeded code
Add null check
Change name of RegisterLoopForStructType to RegisterLoopByDescr
Add test for RegisterLoopByDescr and custom dtypes
Code cleanup