* feat(tui): coalesce reasoning deltas with kind-switch flush
Extend the stream coalescer to batch agentReasoningMsg deltas alongside
assistant-text at ~60fps, flushing on kind switches so interleaved
prose and reasoning never reorder. Fixes the O(n^2) re-render
pathology where each thinking delta re-rendered the whole accumulated
block.
* perf(tui): make reasoning stream append and preview rendering O(1) per delta
streamingReasoning accumulated with string += delta, the same O(n^2)
append pathology that streamingText had already been migrated away
from for. Switch it to []byte so each reasoning delta is an amortized
O(1) append, read through streamingReasoningString().
The live preview also paid per-frame costs on the growing string:
reasoningPreviewLines split the entire accumulated reasoning to show
the last two lines, and previewTail rune-converted whole lines. Both
now walk backwards over only the tail they render, so preview cost is
bounded by the visible width instead of segment length.
* fix(tui): clear fired coalescer timer so later deltas re-arm and never stall
* fix(tui): normalize invalid UTF-8 in truncated reasoning preview tail