refactor(io): unify QB45 binary GET/PUT layout in QbBinaryCodec
The little-endian byte layout (INTEGER 2, LONG 4, SINGLE 4, DOUBLE 8,
fixed STRING*n space-padded) was written out four times in Interpreter:
scalar and record variants of both decode and encode, and the
record-target lookup (scalar cell vs array element) was copy-pasted
between decodeInto and encodeFrom.
QbBinaryCodec owns the layout now: decodeScalar/encodeScalar,
decodeRecord/encodeRecord over field descriptors. Numeric range
narrowing stays in the interpreter (it raises the trappable Overflow);
the codec is pure byte layout. Interpreter gains one recordTarget()
lookup used by byteSizeOf, decodeInto and encodeFrom.
Verification: 93/93 tests green; INDEX (RANDOM record GET/PUT),
QLBDUMP (BINARY GET into TYPE records) and SEARCH re-run — all
pixel-identical to the pre-refactor captures.