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`.
The case I'm addressing is targeting `xproto.ChangeProperty` calls, which may take as their data a string (for WM_NAME) or a list of atoms (for WM_PROTOCOLS), and the data field is type void, so 'c' makes sense. xpyb makes you pack your own data, so I don't think this would come up there. This assumes if `from_` is not a string, it should be packed as a list of 32 bit objects, which I'm not totally sure is valid.