return (value, path = new Path()) => {
    const failures = [];
    for (const checker of checkers) {
      const result = checker(value, path);
      if (result.type === 'success') {
        return success(result.value, result.warnings);
      }
      failures.push(result);
    }

    return unionFailure(
      'value did not match any types in union',
      path,
      failures,
    );
  }
checker which asserts the value matches
at least one of the provided checkers

NOTE: the reason `union` and `or` both exist is that there is a bug
      within flow that prevents extracting the type from `union` without
      annotation -- see https://fburl.com/gz7u6401