code: @Override
      public void close() throws SourceCloseException {
          for (Backend backend : this.backends) {
              backend.removeBackendListener(this);
          }
          List<BackendCloseException> exceptions = new ArrayList<>();
          for (Backend backend : this.backends) {
              try {
                  backend.close();
              } catch (BackendCloseException ex) {
                  exceptions.add(ex);
              } catch (Error | RuntimeException ex) {
                  exceptions.add(new BackendCloseException(ex));
              }
          }
          if (!exceptions.isEmpty()) {
              throw new SourceCloseException(exceptions.toArray(new BackendCloseException[exceptions.size()]));
          }
          this.closed = true;
      }
docs: Removes this {@link Source} as a listener to the {@link Backend}s
  provided to the constructor.
  
  Must be called by subclasses, or proper cleanup will not occur.