Core: Accept 32-Bit integer values in both the signed and unsigned range for PsychCopyInIntegerXXX.

Allow passing in uint32 range values as integer arguments, even if they
get wrapped to negative values when internally stored in int’s aka
int32’s. This allows for better OpenGL interop, as some OpenGL drivers
return shader handles as GLuint’s (==uint32’s) > INT_MAX. Accepting
these will cause cast from uint32 to int32 at PsychCopyInIntegerArg()
time and then cast from int32 to uint32 aka GLuint when passed to
OpenGL API, so all is good.

Should fix issue reported in PTB forum message thread starting at #17204

Another workaround would be to mangle stuff in M-File code, e.g., as
addition to glCreateProgram.m, but this sounds like it could recur in
other cases, so fix it internally:

% Typecast magic: r is a double, encapsulating a uint32, but
% some Screen() functions only accept int32 range. Convert it
% into a int32 equivalent which will pass the range checks and
% convert back into the original uint32 value inside Screen():
r = double(typecast(uint32(r), 'int32'));