matching: refactor recursive specialization functions for clarity
matching: refactor recursive specialization functions for clarity

Several functions in the pattern-matching compiler do recursive
"specialization" through a filter_rec helper written in tail-call
style with a 'rem' parameter containing the matrix rows yet to be
processed as input. Typical returns of the function are

  foo :: filter_rec rem

to add a new output, and

  filter_rec (foo :: rem)

to add a new input to be processed (usually by partial decomposition
of the current input row).

Some places would contain the declaration (let rem = filter_rec rem)
to factorize outputs of the first kind, but this gives a programming
style that is very confusing as `rem` may now represent either an
input or an output of the filter.

Using better types (as will be done farther away in the
pattern-matching refactoring) avoids this problem completely:
specialization then has different input and output types (typically,
from general to half-simple patterns), so incorrectly mixing inputs
and outputs is impossible. Yay typing.

gerdstolpmann/ocaml,gerdstolpmann/ocaml,gerdstolpmann/ocaml,gerdstolpmann/ocaml,gerdstolpmann/ocaml