### 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
}
        } catch (GeneralSecurityException e) {
            logger.warn("Could not get stored superseding token values", e);
            listener.onFailure(invalidGrantException("could not refresh the requested token"));
        }
    }
    /*
     * Encrypts the values of the superseding access token and the refresh token, using a key derived from the superseded refresh token.
     * The tokens are concatenated to a string separated with `|` before encryption so that we only perform one encryption operation
     * and that we only need to store one field
     */
    String encryptSupersedingTokens(
        byte[] supersedingAccessTokenBytes,
        byte[] supersedingRefreshTokenBytes,
        String refreshToken,
        byte[] iv,
        byte[] salt
    ) throws GeneralSecurityException {
        Cipher cipher = getEncryptionCipher(iv, refreshToken, salt);
        final String supersedingAccessToken = Base64.getUrlEncoder().withoutPadding().encodeToString(supersedingAccessTokenBytes);
        final String supersedingRefreshToken = Base64.getUrlEncoder().withoutPadding().encodeToString(supersedingRefreshTokenBytes);
        final String supersedingTokens = supersedingAccessToken + "|" + supersedingRefreshToken;
        return Base64.getEncoder().encodeToString(cipher.doFinal(supersedingTokens.getBytes(StandardCharsets.UTF_8)));
    }
    private void getTokenDocAsync(
        String tokenDocId,
        SecurityIndexManager tokensIndex,
        boolean fetchSource,
        ActionListener<GetResponse> listener
    ) {