id_effect 0.4.0

Effect<A, E, R> (sync + async), capability DI, pipe — interpreter-style, no bundled executor
Documentation
# Replay fanout

[`broadcast_with_replay`](../../src/streaming/replay.rs) extends [`Stream::broadcast`](../../src/streaming/stream.rs) with a sliding replay tail.

```rust
use id_effect::{Stream, broadcast_with_replay, run_async};

let src = Stream::from_iterable(1..=100);
let (mut branches, pump) = run_async(
    broadcast_with_replay(src, /* hub */ 64, /* replay tail */ 16, /* branches */ 2),
    (),
)
.await?;

// Run `pump` concurrently with pulls on each branch (same pattern as `broadcast`).
```

- **`hub_capacity`** — sliding [`PubSub`]../../src/coordination/pubsub.rs ring size.
- **`replay_len`** — number of recent items retained in the shared replay buffer (also seeded into each branch buffer as the pump runs).
- **`Stream::broadcast_replay(cap, branches)`** — convenience wrapper using `replay_len == cap`.

Return shape matches broadcast: `(Vec<Stream<…>>, pump_effect)`.