Four changes that compound to a 2-5x speedup on VHI rebuild for large
files, plus eliminating one full wasted VHI pass on initial open.
* spawn_indexer no longer computes VHI inline (progressive_reader.rs).
The inline VHI used a hardcoded width=80, was invalidated immediately
on Loading->Ready transition (gutter digit-boundary), and triggered
a second full rebuild. Now returns visual_height_index: None and lets
the UI trigger one rebuild with the correct post-layout width.
* spawn_visual_height_rebuild rewritten as a single linear pass over
mmap bytes using memchr::memchr (SIMD) to find newlines, replacing
the byte-by-byte BufRead::read_until scan. Cancel check throttled
to every 1MB instead of per-line.
* wrap_line_count(&str, width) -> usize added as a zero-allocation
counterpart to wrap_line_chars. Property tests cover ASCII, CJK,
emoji, combining marks, tabs, zero-width chars, control chars, and
real log lines across many widths - all match wrap_line_chars().len()
exactly. compute_text_visual_height now uses wrap_line_count, removing
10M Vec allocations on a 10M-line file.
* format_json_line returns Cow<'_, str> instead of String. Non-JSON
lines borrow the input (zero allocation); only pretty-printed JSON
objects allocate. Removes another 10M allocations when json_format=true.
Removes now-unused compute_visual_heights (only caller was the deleted
inline VHI path).