The only concrete class reference that should be in the `api` module is `AuthenticationScheme`.

Anything else is an implementation-specific detail (like the `RequestAuthenticator` interface) that should be in impl.

Here are my ideas for design:

If we have a `RequestAuthenticatorCreator` concept, please call it `RequestAuthenticatorFactory`.  It would look like this:

```java
public interface RequestAuthenticatorFactory {
    RequestAuthenticator createRequestAuthenticator(AuthenticationScheme scheme) {
}
```

The `AuthenticationScheme` enum could look like this:

```java
public enum AuthenticationScheme {
    Basic,
    SAuthc1
}
```
(you'll see why I didn't use all uppercase in a second).

Then, we could have a new `DefaultRequestAuthenticatorFactory` implementation:

```java
public class DefaultRequestAuthenticatorFactory implements RequestAuthenticatorFactory {
    public RequestAuthenticator createRequestAuthenticator(AuthenticationScheme scheme) {
        String className = "com.stormpath.sdk.impl.authc." + scheme.name() + "RequestAuthenticator";
        return Classes.newInstance(className);
    }
}
```
Seems pretty clean/easy to me.

Or the Enum can have all uppercase values, but the enum would have a private final String requestAuthenticatorClassName property with the fully qualified class name of the one to instantiate.  That's probably a better idea.

Note that this approach is fine (only exposing `AuthenticationScheme` in the api) and everything else in `impl` because no-one can really create their own authentication scheme: The Stormpath API servers must support any known scheme, and as such, there will only ever be a fixed number of supported schemes that we would implement in any SDK.