### Description

Currently, the [`tryAuthenticateToken`](https://github.com/elastic/elasticsearch/blob/55088d154d1764a6d4fa8e9078bde9da1e9ff9a5/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/TokenService.java#L458) method calls `decodeAndValidateToken` which ends up sending two `GetRequest` for the same token ID. First in [`decodeToken`](https://github.com/elastic/elasticsearch/blob/55088d154d1764a6d4fa8e9078bde9da1e9ff9a5/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/TokenService.java#L602) and second in [`checkIfTokenIsValid`](https://github.com/elastic/elasticsearch/blob/55088d154d1764a6d4fa8e9078bde9da1e9ff9a5/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/TokenService.java#L1977). The second call is unnecessary as we already fetched the access token in the first call, it's just simply dropped. We should refactor these two methods to avoid sending second get request just to validate the access token.
x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/TokenService.java
findTokenFromRefreshToken(hashedRefreshToken, securityTokensIndex, backoff, listener);
                    }
                } else {
                    logger.debug("Unrecognized refresh token version [{}].", version);
                    listener.onResponse(null);
                }
            } catch (IOException e) {
                logger.debug(() -> "Could not decode refresh token [" + refreshToken + "].", e);
                listener.onResponse(null);
            }
        }
    }
    /**
     * Performs an asynchronous search request for the token document that contains the {@code refreshToken} and calls the {@code listener}
     * with the resulting {@link SearchResponse}. In case of recoverable errors the {@code SearchRequest} is retried using an exponential
     * backoff policy. This method requires the tokens index where the token document, pointed to by the refresh token, resides.
     */
    private void findTokenFromRefreshToken(
        String refreshToken,
        SecurityIndexManager tokensIndexManager,
        Iterator<TimeValue> backoff,
        ActionListener<Doc> listener
    ) {
        final Consumer<Exception> onFailure = ex -> listener.onFailure(traceLog("find token by refresh token", refreshToken, ex));
        final Consumer<Exception> maybeRetryOnFailure = ex -> {
            if (backoff.hasNext()) {
                final TimeValue backofTimeValue = backoff.next();
                logger.debug("retrying after [{}] back off", backofTimeValue);
                client.threadPool()
                    .schedule(