### Description

`TransportGrantAction` currently provides an `executeWithGrantAuthentication` method which sub-classes can leverage. Instead of requiring sub-classes to invoke this method directly, we instead can move it into the `doExecute` method of `TransportGrantAction`, and allow inheritors to specify their own handler for grant authentication, something along the lines of: 

```
class TransportGrantAction {

    final void doExecute(...) {
        // executeWithGrantAuthentication can furthermore be inlined as part of this refactor
        executeWithGrantAuthentication(request, ActionListener.wrap(
            authentication -> { doSomethingWithAuthentication(...) }
        ));
    }

    abstract doSomethingWithAuthentication(...);
}
```

This reduces boilerplate and establishes a clearer contract for sub-classes of `TransportGrantAction`.
x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/action/TransportGrantAction.java
new AuthenticateRequest(effectiveUsername),
                            ActionListener.wrap(ignore2 -> listener.onResponse(authentication), listener::onFailure)
                        );
                    }
                } else {
                    if (runAsUsername != null) {
                        
                        listener.onFailure(
                            new ElasticsearchStatusException("the provided grant credentials do not support run-as", RestStatus.BAD_REQUEST)
                        );
                    } else {
                        listener.onResponse(authentication);
                    }
                }
            }, listener::onFailure);
            if (runAsUsername != null) {
                threadContext.putHeader(AuthenticationServiceField.RUN_AS_USER_HEADER, runAsUsername);
            }
            authenticationService.authenticate(
                actionName,
                grantRequest,
                authenticationToken,
                ActionListener.runBefore(authenticationListener, authenticationToken::clearCredentials)
            );
        } catch (Exception e) {
            listener.onFailure(e);
        }
    }
}