/// Receives solver events and decides how the iteration should proceed.
///
/// Observers let callers monitor or steer a solver without changing its API,
/// enabling logging, early stopping, or custom control policies.
///
/// The `observe` method returns `Option<A>`, where `Some(action)` requests a
/// solver-specific action and `None` signals the solver should continue unchanged.
///
/// Closures automatically implement `Observer`, and a built-in impl for `()`
/// provides a no-op observer that always returns `None`.
/// Blanket implementation for observer closures.
/// A no-op observer that always returns `None`.