This structure should be opaque for everyone using the library, and every public API just uses a pointer to it.