Sensible learning.

A rule may now learn what *segments* (rather than sequences of characters) to
match to a dictionary definition. This is achieved by the introduction of the
(addseg) instruction. It keeps track of a list of segments, so that you can
describe a syllable (or mora, or anything else you need) in tranny, and then
the (makedef) instruction takes that list and matches it to the definition.

(this commit also introduces the reduce() functions; they reduce the number
of monads to spawn by doing some checks. For now, only tranny/learn.c uses this
but soon I will write one for tranny/parse.c and the rest also.