IO & Logging Capabilities
Using newtypes and type classes, we create a wrapper around IO
with support for logging capabilities. This approach keeps log entries as values, enables log aggregation, and supports diagnostic contexts, while also making logging easily testable. For dispatching logs, any preferred library can be used.