Sage/Y-Combinator/Z-Combinator

Used for fixed-point recursion.

If we implemented the Sage combinator (Y-Combinator) like this:

// WRONG
export const Sage = (x: Fn): Fn => x(Sage(x));

It would cause a stack overflow. So we use the Z-Combinator instead, which is designed for strict/eager languages.