Make declaration of specialized signatures less repetitive

Instead of hard-coding all possible signatures for all specialized functions, generate them. This relies on ordering of numba types (according to bitwidth).
If the naming is following the NumPy convention, then I think it is supposed to be the size of `size_t` (and `intp` is `ssize_t`).