#410 Artifact cleanup extension

Let's talk about it a little bit more before potentially changing it. Here's what I was thinking. The usage will look something like this (exceptions not yet handled):

```
public List<StageDetailsArtifactCleanup> listOfStageInstanceIdsForArtifactDeletion() {
    final ArrayList<StageDetailsArtifactCleanup> list = new ArrayList<StageDetailsArtifactCleanup>();

    DefaultGoPluginApiRequest requestToSend = new DefaultGoPluginApiRequest(NAME, "1.0", REQUEST_LIST_OF_STAGES_INSTANCES);

    Action<GoPluginApiResponse> actionForEachResponse = new Action<GoPluginApiResponse>() {
        @Override
        public void execute(GoPluginApiResponse response, GoPluginDescriptor pluginDescriptor) {
            if (SUCCESS_RESPONSE_CODE == response.responseCode()) {
                processStageInstanceDetailsResponse(list, parseResponse(response.responseBody()));
            } else {
                LOGGER.warn(format("Unsuccessful response retrieving stage details details from plugin %s. Returned response code %s and response body %s", plugin.getId(), response.responseCode(), response.responseBody()));
            }
        }
    };

    defaultPluginManager.submitToAllOfType(NAME, requestToSend, actionForEachResponse);
    return list;
}
```

The implementation would look something like this (exceptions not yet handled):

```
public void submitToAllOfType(final String extension, final GoPluginApiRequest apiRequest, final Action<GoPluginApiResponse> action) {
    goPluginOSGiFramework.doOnAll(GoPlugin.class, new Action<GoPlugin>() {
        @Override
        public void execute(GoPlugin plugin, GoPluginDescriptor pluginDescriptor) {
            GoPluginIdentifier pluginIdentifier = plugin.pluginIdentifier();
            if (extension.equals(pluginIdentifier.getExtension())) {
                action.execute(submitTo(pluginIdentifier.getId(), apiRequest), pluginDescriptor);
            }
        }
    });
}
```

As you can see, the users of it don't need to know about the implementation of submitTo. In fact, this calls submitTo. It just doesn't expose the plugin IDs to the caller, that's all.

I'm not very strongly against the other approach. It's just that we had decided that the PluginManager is the point where this abstraction would be, but this change would make it go up to plugin-access (which is not a far layer, I agree).