RFC: io: Add support for fixed-size structs 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 should be useful for many common scenarios such as parsing a simple binary file format.