fix: stop short mlx chunks stalling playback
Was getting a few seconds of silence partway through replies on the mlx backend. Down to how split_long_text packs the chunks, a short sentence went out on its own ahead of a full 170 char chunk so it finished playing long before the next one had generated. "Yes." followed by a long sentence sat there for 7.3s! Long sentences were also getting cut at whatever word hit the limit, mid clause.
Now anything over 170 splits at , ; : or a dash first and only falls back to words if a clause is still too long, and a chunk under 60 chars borrows the start of the next sentence rather than going out alone. (Tried ramping chunk sizes up from a small first one as well, made it worse, the fixed cost per generate call eats the head start.)
Ran four texts through a local model just under real time, old vs new, timing playback by sleeping for each chunk's duration. The two with a short opener had no gaps after, the two normal paragraphs chunk the same as before. Downside is first audio comes later when a reply opens on something tiny (1.0s to 8.9s worst case), same as a long opener gets now.
434 tests (4 new), ruff clean, README updated.