/// Per-object lifecycle events emitted by
/// [`Transfer::download`](crate::Transfer::download) and
/// [`Transfer::upload`](crate::Transfer::upload).
///
/// Sent on the optional [`tokio::sync::mpsc::UnboundedSender`] passed in
/// by the caller. Order across objects is unspecified — events for one
/// object are ordered (Started → Progress* → Completed | Failed).
///
/// `Failed` carries a stringified error so the typed
/// [`TransferError`](crate::TransferError) can still be moved into
/// [`Report`](crate::Report) — events are for display, the report is
/// authoritative.