Read a parenthesised function type in return position as a function type

A function type in return position has two spellings, and only one of them was
recognised:

    -> (Int) -> String     the `->` is AFTER the matching `)`
    -> (() -> Int)         the `->` is INSIDE the parens

The second fell into the tuple arm of `return_annotation`, which consumes to the
first `)` that is not preceded by a comma. In `(() -> Int)` that is the paren
closing the EMPTY parameter list, so the annotation ended at `()` and `-> Int)`
was left in the token stream. `parse_block` then went looking for `{`, found
`->`, and reported `expected '{'`; after that the file was dead. One annotation
killed the rest of the file, and the message named a brace that was never the
problem.

`return_annotation` now accepts either spelling. The test is "is there a `->`
associated with these parens", and there are exactly two places it can be --
inside them, or immediately after the matching `)`. One nesting-tracking scan
sets `arrow_inside` when an arrow is reached before the depth returns to zero,
and the condition becomes `arrow_inside || is_fn`.

Every affected site is settled valid: `moon check` reports zero errors on the
parenthesised spelling, the parameterised spelling, the nested one whose result
is a tuple, the optional `-> (() -> Unit)?`, the `raise`-bearing one, the
multi-line signature with a generic and a qualified name, and the
unparenthesised spelling that already worked.

CORPUS EFFECT, measured as a two-build A/B on one tree rather than against the
old numbers. Three moui files go from PARTIAL to fully parsed -- services/
service_task.mbt, core/program_subscription.mbt and backend/common/services/
service_async_queue.mbt -- and `unexpected token` drops from 113 files to 110.
The other five corpora are byte-identical.

Two measurement corrections that this release is built on, because both of them
first reported a clean zero:

- The A/B itself. proton's actionable count reads 68 here against a recorded 100,
  and that gap is entirely the corpus TREE: the old baseline was taken against a
  TEMP sibling tree, and `--extern-iface-dir` feeds sibling interface tables into
  the run. Comparing across two trees measures the trees.
- The population count. The matcher could not match `fn[T]`, `Type::name`, or a
  multi-line parameter list, so it reported 0 sites for a construct that appears
  24 times in 9 moui files. It now matches on the `->` token rather than on a
  signature it would have to parse, and it is gated on finding the three files
  the A/B says changed.

Tests: 425 js (13 new). Every fixture is checked by BOTH `moon check` and the
analyzer, and the settle script's negative control has to be rejected by both
before any verdict from it is believed.

Mutation gate: five mutations, four killed. M4 -- treating every parenthesised
return as a function type -- survives, and it is an EQUIVALENT mutant rather
than an untested one, which is proved rather than assumed: the tuple arm returns
an empty annotation and the function-type arm returns the parenthesised group,
and `ann_to_ty` maps BOTH to TUnknown, so over the whole input space the
annotation string cannot differ. A first attempt to kill M4 with a never-called
fixture asserted `ann_to_ty("(Int)")` was TInt; it is TUnknown, because no arm
of `ann_to_ty` strips parentheses. The fixture stays -- the declared-return path
deserves one -- but its comment now says what it does and does not establish.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>