storage: fix credentials issue.

Previously, if a user wanted to generate a signed URL, there was no guarantee a credentials object would have already been generated. By itself, generating a signed URL doesn't require a network connection, thus the uncertainty that we would have already fetched a token. This change requires a valid credentials object to exist before returning the `credentials` object.

~~This also brings up an issue. We need to go through the code to catch any "maybe async, maybe not" functions, and add in a `process.nextTick` where necessary.~~ (#166)
This is more like how our functions do it throughout the codebase. The options object is resolved at the head of the function to either be provided or resolved to an empty object.

If we didn't provide `opts` when we invoked, `this.scopes = opts.scopes || [];` would throw a type error, "cannot read property "scopes" of undefined"