code: public Observable<HalDifference> compareRecursively(HalComparisonContextImpl context, HalResource expected, HalResource actual) {
  
      // don't follow links to any resources later that are already embedded (and have a self link) in the current resource
      expected.collectLinks("self").stream()
          .map(Link::getHref)
          .forEach(url -> expectedUrlsToIgnore.add(url));
  
      return collectLocalDifferences(context, expected, actual)
          .concatWith(collectEmbeddedDifferences(context, expected, actual))
          .concatWith(collectLinkedDifferences(context, expected, actual));
    }
docs: This method is initially called by the {@link HalComparisonImpl} with the API entry point resources, and then again
  for each embedded and linked resource that is to be processed (as decided via the {@link EmbeddedProcessing} and
  {@link LinkProcessing} interfaces)
  @param context specifies in which part of the tree the comparison is currently being executed
  @param expected the "ground truth" resource
  @param actual the resource to be compared against the ground truth
  @return an {@link Observable} that emits one {@link HalDifference} object for each difference that was detected in
  the given resources (and its linked/embedded resources)