pub async fn serve(opts: Opts) -> Result<()>
Serve the UI independently from scheduler and execution workers. A restart releases its listener before starting the successor.