I do not think the lib consumer should access the various module protocol and their `StateX` types. We should try to use `pub(crate)` to direct a consumer in using the functions and structs introduced in `lib.rs` with #22.