libmemhack: introduce uintptr_t handling

Calulating with (void *) for memory addresses is really cumbersome
with a lot of conversions between pointers and integers of the size
of a pointer. In order to simplify that, store all memory addresses
as uintptr_t.

The printf() and scanf() format specifiers need to be changed to
PRIxPTR and SCNxPTR. Also the limits are different with
UINTPTR_MAX. But uintptr_t is optional and may not be available.
So use unsigned long in that case unless it is 64 bit Windows.
There we need unsigned long long.

Do this for libmemhack only as it doesn't rely on other code and
communicates via FIFOs.