feat(ui): add in-house QR encoder + scalable drawQr component
Self-contained ISO/IEC 18004 byte-mode QR encoder (no vendoring, no deps):
RS ECC over GF(256), block interleaving, function-pattern placement, the 8
mask patterns scored by the 4 penalty rules, and format/version info. Auto
smallest version (1..10, documented RAM cap), ECC L/M/Q/H, malloc-free.
Fix the data-placement bug from the partial work: the zigzag direction was a
running toggle; the correct rule is per-column ((right & 2) == 0) XOR
(col < 6), and the byte-aligned padding / two-copy format-info mapping were
off. The encoder now matches a trusted generator (segno) module-for-module on
pinned known-answer vectors (HELLO WORLD v1-M mask4, a URL v2-M mask2) and
decodes across versions/ECC levels.
Add ui::drawQr (scalable, quiet zone, theme tokens) + ui::qr::wifi escaped
payload builder, and replace the admin WiFi-QR finder-pattern placeholder with
a real scannable QR. Tests: encoder (known-answer + auto-version + caps),
payload escaping, component rendering.