Allow enum discriminants to not be uint, and use smallest possible size by default.

This is the long-awaited branch to allow enum discriminants to be any integral type.  The default is the smallest one that can represent the possible values, but this can be overridden by an attribute, either to a specific type or to whatever the platform's C ABI would use.  The `ctypes` lint pass is extended to detect non-FFI-safe enums in foreign item types.

This pull request is to get feedback; I've fixed the months of bit rot, and it passes `make check` on x86_64 Linux, and I've squashed it into a reasonably comprehensible form — but it definitely needs more tests, and I think some of the commit messages could stand to be more informative.