Change all unsigned long to SHA_LONG for 64-bit systems

where SHA_LONG is defined as u32. This fixes the problem that checksum
differs every time.
Pass NULL as the pointer instead of 0

0 is a 32-bit integer, and NULL on x64 should be 64-bit, this leads to a
crash with the following code:

do http://www.rebol.com/speed.r ;this runs fine
do http://www.rebol.com/speed.r ;this crashes the interprator
Fix the crashing on 64-bit systems

"multiply -1 -9223372036854775808" raises an arithmetic exception at
"anum / num". It doesn't crash on 32-bit systems because gcc uses a
function __divi3 to do the division instead of the CPU division
instruction directly.
Fix a crash on 64-bit systems

When index = tail, it will crash on 64-bit systems:

REBCNT out = 0 here:
for (out--; out >= start; out--) {
	//out = 0xFFFFFFFF (or -1 as a signed integer)
	uc = GET_ANY_CHAR(ser, out); //expands to ser->data[out], which
is the same as *(ser->data + out). On 32-bit system, ser->data is
32-bit, so it's equivalent to *(ser->data - 1), which is a valid address,
but wrong content; while on 64-bit system, ser->data is 64-bit, so "out"
has to be promoted to 64-bit integer, which results in *(ser->data +
0xFFFFFFFF), which is not a valid memory location.
    ...
}