syntax for arrows and unions

arrows are now written

  {f1:T1, f2:T2}
    (all L1, L2. S1, S2, S3 / *L1: R1) -> (some L3. T / *L3: R3)

where the rely set can be omitted, and any of the three parts of the input
world and the three parts of the output world can be omitted. notice that
there are parens on the output world even when there's only a type, and no
existentials or output heap.

when arrows appear in expression positions (i.e. as casts), to lighten
the syntax a bit, the parens around the worlds are dropped.

when arrows are written inline with a lambda, formals can appear along with
any of the input types S1, S2, etc.

unions are now written

  U (T1 T2 T3)

to avoid having to rig the grammar so that arrows and unions don't interfere.