Correct bad sign conversion from unmarshalling (#9131)

We originally used unmarshallByte to unmarshall into a uint8_t, which
is incorrect but happens to work.  Then item_description was changed
to an array of uint32_t, so the conversion from int8_t sign-extended
before converting to unsigned.  Then later we store these values in
item_def::subtype_rnd, which is signed, and they become negative numbers
that cause problems for wand_secondary_string and friends.

Unmarshall that byte correctly, and fix up old saves that may have
been affected.  This doesn't do anything about the fact that we convert
from unsigned to signed in item_colour.
Replace some magic constants.

But books use constants here that differ from NDSC_*, so leave those.