"Given a function with return type `Y`, and a second 
 function with a single parameter also of type `Y`, return 
 the composition of the two functions. The first function 
 may have any number of parameters.
 
 For any such functions `f()` and `g()`,
 
     compose(g,f)(*args)==g(f(*args))
 
 for every possible argument tuple `args` of `f()`."
see(`function curry`, `function uncurry`)
tagged("Functions")
shared X(*Args) compose<X,Y,Args>(X(Y) x, Y(*Args) y) 
        given Args satisfies Anything[]
               => flatten((Args args) => x(y(*args)));
               //=> flatten((Args args) => x(unflatten(y)(args)));