Composes functional guards together into a single functional guard. Both blocking and non-blocking guards may be specified. Blocking guards run in serial, waiting for a response before calling the next blocking guard. If a blocking guard returns a failure condition (falsy or a `UrlTree`), all future guards will be skipped and not called. The failure condition return will be returned from the composed guard. Non-blocking guards are run in parallel after all of the blocking guards have finished.