### 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
final TransportVersion tokenVersion = getTokenVersionCompatibility();
        createOAuth2Tokens(accessTokenBytes, refreshTokenBytes, tokenVersion, authentication, originatingClientAuth, metadata, listener);
    }
    /**
     * Create an access token and optionally a refresh token as well from predefined values, based on the provided authentication and
     * metadata.
     *
     * @param accessTokenBytes      The predefined seed value for the access token. This will then be
     *                              <ul>
     *                                <li> Encrypted before stored for versions before {@link #VERSION_TOKENS_INDEX_INTRODUCED} </li>
     *                                <li> Hashed before stored for versions after {@link #VERSION_TOKENS_INDEX_INTRODUCED} </li>
     *                                <li> Stored in the security index for versions up to {@link #VERSION_TOKENS_INDEX_INTRODUCED}</li>
     *                                <li> Stored in a specific security tokens index for versions after
     *                                {@link #VERSION_TOKENS_INDEX_INTRODUCED}</li>
     *                                <li> Prepended with a version ID and Base64 encoded before returned to the caller of the APIs</li>
     *                              </ul>
     * @param refreshTokenBytes     The predefined seed value for the access token. This will then be
     *                              <ul>
     *                                <li> Hashed before stored for versions after {@link #VERSION_TOKENS_INDEX_INTRODUCED} </li>
     *                                <li> Stored in the security index for versions up to {@link #VERSION_TOKENS_INDEX_INTRODUCED}</li>
     *                                <li> Stored in a specific security tokens index for versions after
     *                                {@link #VERSION_TOKENS_INDEX_INTRODUCED}</li>
     *                                <li> Prepended with a version ID and encoded with Base64 before returned to the caller of the APIs
     *                                for versions after {@link #VERSION_TOKENS_INDEX_INTRODUCED}</li>
     *                              </ul>
     * @param tokenVersion          The version of the nodes with which these tokens will be compatible.
     * @param authentication        The authentication object representing the user for which the tokens are created
     * @param originatingClientAuth The authentication object representing the client that called the related API
     * @param metadata              A map with metadata to be stored in the token document