refactor(interp): extract PRINT formatting into PrintFormat
The classic number style (SINGLE 7-digit / DOUBLE 16-digit, D±xx/E±xx
scientific, sign padding), the PRINT USING field walker, and the
14-column zone arithmetic lived in Interpreter; the zone math was
duplicated in two places with different wrap rules (console wraps at
its column count, file output at 255).
PrintFormat now owns all of it: number()/singleNumber(), usingFormat()
with an item-value callback (items still evaluate in the interpreter),
numericField(), and nextZone() shared by the console printZoneAdvance
and IoSubsystem's PRINT # zones — the wrap rule is now an explicit
parameter at both call sites instead of two divergent inline copies.
Verification: 93/93 tests green; CHECK (PRINT USING), FLPT (STR$/HEX$)
and BAR (PRINT USING + records) re-run pixel-identical.