Zulip bots with Eio

Run message handler concurrently with broadcast loop in poe

The loop command now responds to DMs and mentions while sleeping
between broadcast intervals, using Eio.Fiber.both to run both
loops concurrently.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

+13
+13
lib/zulip_bot/bot.mli
··· 142 142 (** [fetch_identity client] retrieves the bot's identity from the Zulip server. 143 143 144 144 @raise Eio.Io on API errors *) 145 + 146 + val process_event : 147 + client:Zulip.Client.t -> 148 + storage:Storage.t -> 149 + identity:identity -> 150 + handler:handler -> 151 + Zulip.Event.t -> 152 + unit 153 + (** [process_event ~client ~storage ~identity ~handler event] processes a single 154 + Zulip event. 155 + 156 + This is useful for custom event loops that need finer control over event 157 + processing than [run] provides. *)