Expand description
Newtype wrappers for the three identifier namespaces used throughout gapseq.
Keeping them distinct at the type level prevents passing a reaction id where
a compound id is expected. The underlying storage is String for now;
once the model-loading hot paths are profiled we can swap to interned
Arc<str> without touching call sites.