More char packing

Pack ints when they are >= 256 (`bytes([i])` and `bytearray([i])` can't do it) and pack ints as 4 bytes in all cases. This assumes that if something is packed as `'c'` and is not a string, it is an int, which I'm not sure of, but is the case for things like atoms, and so is necessary for actions like doing `ChangeProperty` (which packs atoms (i.e. ints) to `'c'`) to set `WM_PROTOCOLS`.
'c' represents a char, which should only be 8 bytes. Are there cases where we're packing things that are >8 bytes as 'c'? That seems like a bug somewhere else.