/// 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 a single 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.