Backfill the test gap left by #37460's reasoning streaming:
- _handle_reasoning_chunk_event guard: non-empty emit, empty+non-final
dropped, empty+final terminal marker emitted
- _handle_node_succeeded_event: LLM reasoning_content persisted into
metadata.reasoning, accumulating across passes (not overwriting)
- workflow_app_runner: NodeRunReasoningChunkEvent translates to a
published QueueReasoningChunkEvent