RFC: io: Add support for composite types to `read`

`read` is called for each field in the composite type. The result of
each `read` is stored in a tuple and then passed to the composite
type's constructor.

It only works if all of a composite type's fields are typed and supported by `read`. If a field's type is unspecified or unsupported by `read`, an error will occur.

It's not as powerful as [StrPack.jl](https://strpackjl.readthedocs.org/en/latest/), but it seems sufficient for many of my needs.

## Testing

I have only tested this in the REPL so far. **I have not yet tested a clean build with this change**. I still need to get a VM and build environment setup to do that. I'll update the status once I've completed that (probably tomorrow).