Corpus position 4208/4708: js/web/websocket/websocket-close-fragmented.test.ts.
The raw Bun TCP fixture must run through the shared in-memory listener topology, retain an incomplete close frame until its full declared payload arrives, decode the received close code and UTF-8 reason, send the masked close reply, and publish the correct clean CloseEvent. The current parser discards the received payload by routing opcode 8 through parameterless close(), producing an empty reason.
Implement general RFC 6455 close-payload handling rather than special-casing this fixture: bodyless frames report 1005, reserved/invalid wire codes report 1002, malformed UTF-8 reports 1007, and valid codes/reasons pass through. Add permanent exact-file and payload-matrix regressions. Acceptance: unchanged upstream file 1/1, zero failed/todo/unsupported/allowed-empty.