mDNS/DNS-SD service discovery for OCaml (RFC 6762/6763)

fix(fuzz): TTY restore, crowbar budget, skip afl runtest, E725 lint rule

- Restore cursor on exit via at_exit in Tty.Progress (fixes TTY corruption)
- Install SIGINT handler in monopam test for clean Ctrl-C
- Add 2s per-iteration timeout and 2s total budget to crowbar
- Group crowbar alcotest output by module prefix ("mdns: foo" → group "mdns")
- Skip fuzz runtest in afl context (enabled_if <> profile afl)
- Add merlint E725: enforce "module: description" fuzz test name convention

+16 -14
+2
fuzz/dune
··· 10 10 11 11 (rule 12 12 (alias runtest) 13 + (enabled_if 14 + (<> %{profile} afl)) 13 15 (deps fuzz_mdns.exe) 14 16 (action 15 17 (run %{exe:fuzz_mdns.exe})))
+1 -1
test/test.ml
··· 1 - let () = Alcotest.run "mdns" Test_mdns.suite 1 + let () = Alcotest.run "mdns" [ Test_mdns.suite ]
+11 -13
test/test_mdns.ml
··· 142 142 Alcotest.(check int) "QTYPE is PTR" 12 qtype 143 143 144 144 let suite = 145 - [ 146 - ( "parse", 147 - [ 148 - Alcotest.test_case "PTR with space" `Quick test_ptr_with_space; 149 - Alcotest.test_case "SRV" `Quick test_srv; 150 - Alcotest.test_case "TXT" `Quick test_txt; 151 - Alcotest.test_case "A" `Quick test_a; 152 - Alcotest.test_case "AAAA" `Quick test_aaaa; 153 - Alcotest.test_case "empty" `Quick test_empty; 154 - ] ); 155 - ("merge", [ Alcotest.test_case "merge responses" `Quick test_merge ]); 156 - ("encode", [ Alcotest.test_case "encode query" `Quick test_encode ]); 157 - ] 145 + ( "mdns", 146 + [ 147 + Alcotest.test_case "PTR with space" `Quick test_ptr_with_space; 148 + Alcotest.test_case "SRV" `Quick test_srv; 149 + Alcotest.test_case "TXT" `Quick test_txt; 150 + Alcotest.test_case "A" `Quick test_a; 151 + Alcotest.test_case "AAAA" `Quick test_aaaa; 152 + Alcotest.test_case "empty" `Quick test_empty; 153 + Alcotest.test_case "merge responses" `Quick test_merge; 154 + Alcotest.test_case "encode query" `Quick test_encode; 155 + ] )
+2
test/test_mdns.mli
··· 1 + val suite : string * unit Alcotest.test_case list 2 + (** Test suite. *)