The NotificationSystem struct represents the notification system.
It manages the event bus and the adapters.
It is responsible for sending and receiving events.
It also handles the shutdown process.
The Error enum represents all possible errors that can occur in the application.
It implements the std::error::Error trait and provides a way to convert various error types into a single error type.