docs: public CompletableFuture<Revision> destroyToken(Author author, String appId) {
          requireNonNull(author, "author");
          requireNonNull(appId, "appId");
  
          // Remove the token from every project.
          final Collection<Project> projects = new SafeProjectManager(projectManager()).list().values();
          final CompletableFuture<?>[] futures = new CompletableFuture<?>[projects.size()];
          int i = 0;
          for (final Project p : projects) {
              futures[i++] = removeToken(p.name(), author, appId, true).toCompletableFuture();
          }
          return CompletableFuture.allOf(futures).thenCompose(unused -> tokenRepo.push(
                  INTERNAL_PROJ, Project.REPO_DOGMA, author, "Remove the token: '" + appId,
                  () -> tokenRepo.fetch(INTERNAL_PROJ, Project.REPO_DOGMA, TOKEN_JSON)
                                 .thenApply(tokens -> {
                                     final Token token = tokens.object().get(appId);
                                     final JsonPointer appIdPath =
                                             JsonPointer.compile("/appIds" + encodeSegment(appId));
                                     final String secret = token.secret();
                                     assert secret != null;
                                     final JsonPointer secretPath =
                                             JsonPointer.compile("/secrets" + encodeSegment(secret));
                                     final Change<?> change = Change.ofJsonPatch(
                                             TOKEN_JSON,
                                             asJsonArray(new RemoveOperation(appIdPath),
                                                         new RemoveIfExistsOperation(secretPath)));
                                     return HolderWithRevision.of(change, tokens.revision());
                                 }))
          );
      }