Re-think API

Expose factory functions instead of raw constructors to simplify API surface area.