Change OAuthScopes into an interface as opposed to boilerplating annotations

Particularly in google storage, incorrect `@OAuthScopes` annotations were pasted in a lot of places, guaranteed via also pasting them in tests. This change avoids copy/paste issues, as the current clouds we support have a rather simple set of rules. For example, the following sets up google compute for almost all api usage:

```java
      bind(OAuthScopes.class).toInstance(ReadOrWriteScopes.create(
            "https://www.googleapis.com/auth/compute.readonly",
            "https://www.googleapis.com/auth/compute"
      ));
```

Details:

 * Change OAuthScopes into an interface as opposed to boilerplating annotations
 * Fixed errors because of boilerplating annotations.
I know this is not the scope of this PR, but is it OK to return `null` when returning lists? Shouldn't be more correct to return an empty list, or throw a `ResourceNotFoundException` if the object you are requesting does not exist?