Process an outbox: events are [id, payload]. The processor may fail
(returns false). On failure, retry up to maxRetries times. Each event must
be delivered exactly once in id order. Skip events permanently failed.
solve(events, attemptsByEventId, maxRetries) where attemptsByEventId
maps event id → number of attempts before success (or > maxRetries to fail).
Returns { delivered: [id, ...], dropped: [id, ...] }.
Sample tests