Refactored token persistence and other improvements

Refactored token persistence, added support for GitHub Application OAuth, allowed manually setting access_token.

Note that the `(callable) TokenFactory` is passed to the persistence layer's `restoreToken()` function for token creation now, and there is no need for `RawToken::fromArray()` since the implementation is the same as `RawToken::__construct()`.

Here's an example of showing your GitHub repos using a manually assigned access_token (you can create them in your account on github.com):

```php
<?php

use GuzzleHttp\Subscriber\OAuth2\GrantType\ClientCredentials;
use GuzzleHttp\Subscriber\OAuth2\GrantType\Specific\GithubApplication;
use GuzzleHttp\Subscriber\OAuth2\OAuth2Subscriber;

require_once __DIR__.'/../vendor/autoload.php';

// access_token from github.com
$access_token = "3463246769872348934237655abcdef012424587";

$oauth2subscriber = new OAuth2Subscriber();
$oauth2subscriber->setAccessToken($access_token);

$client = new GuzzleHttp\Client([
	'base_url' => 'https://api.github.com',
	'defaults' => ['auth' => 'oauth'],
]);
$client->getEmitter()->attach($oauth2subscriber);

$data = GithubApplication::getAllResults($client, "/user/repos");
ksort($data, SORT_NATURAL);

foreach ($data as $repo) {
	echo "{$repo['full_name']}\n";
}
```


This more complex example uses the oauth subscriber to create and persist the access token, then uses it to list the repos in an organization:

```php
<?php

use GuzzleHttp\Subscriber\OAuth2\GrantType\ClientCredentials;
use GuzzleHttp\Subscriber\OAuth2\GrantType\Specific\GithubApplication;
use GuzzleHttp\Subscriber\OAuth2\Signer\ClientCredentials\BasicAuth as ClientCredentialsSigner;
use GuzzleHttp\Subscriber\OAuth2\Signer\AccessToken\BasicAuth as AccessTokenSigner;
use GuzzleHttp\Subscriber\OAuth2\Persistence\FileTokenPersistence;
use GuzzleHttp\Subscriber\OAuth2\OAuth2Subscriber;

require_once __DIR__.'/../vendor/autoload.php';

$auth_url = 'https://api.github.com/authorizations';

// github.com credentials
$user = "someuser";
$pass = '12345678901234';

// github.com application details
$client_id = "b42c2f12432342342342";
$client_secret = "3463246769872348934237655abcdef012424587";

// We'll list the repos of this organization (including private repos)
$organization = "foo";

$reauth_client = new GuzzleHttp\Client([
	'base_url' => $auth_url,
	'defaults' => ['debug' => true],
]);

$grant_type = new GithubApplication($reauth_client, [
	"client_id" 	=> $client_id,
	"client_secret" => $client_secret,
	"username"		=> $user,
	"password"		=> $pass,
	"scope" 		=> "public_repo,repo,user,org",
	"note" 			=> "OAuth Test Token",
	"note_url" 		=> "",
]);

$oauth2subscriber = new OAuth2Subscriber($grant_type);
$oauth2subscriber
	->setClientCredentialsSigner(new ClientCredentialsSigner())
	->setAccessTokenSigner(new AccessTokenSigner())
	->setTokenPersistence(new FileTokenPersistence('/tmp/oauth_token.json'));

$client = new GuzzleHttp\Client([
	'base_url' => 'https://api.github.com',
	'defaults' => [
		'auth' => 'oauth',
	],
]);
$client->getEmitter()->attach($oauth2subscriber);

$data = GithubApplication::getAllResults($client, "/orgs/$organization/repos");
ksort($data, SORT_NATURAL);

foreach ($data as $repo) {
	echo "{$repo['full_name']}\n";
}
```