Added smart-casting of GraphObjects for Graph responses

This addresses a TODO list item on #136 and fixes #218.

Added smart-casting of Graph responses into `GraphObject`'s. Admittedly, this one blew my mind a bit and took me forever to get right.


# Problem

The existing `GraphObject` casting only works on the root level of a response from Graph. And the response data would get cast inconsistently. Sometimes returning `stdObject` and sometimes returning an array.


# Solution

Responses from Graph are analyzed recursively and auto-cast to the appropriate `GraphObject` subclass or `GraphList` defaulting to `GraphObject` when it doesn't know.


# A quick assumption

The following examples assume the new way of sending requests to Graph, i.e.

```php
$facebookApp = new FacebookApp('{app-id}', '{app-secret}');
$facebookClient = new FacebookClient();
$request = new FacebookRequest($facebookApp, '{access-token}', 'GET', '/me');
$facebookResponse = $facebookClient->sendRequest($request);
```

Obviously that's more complicated than the final 4.1 release since we don't have factories and services implemented yet. But that's what's going on internally. So for the examples below we'll be ignoring the lines that set `$facebookApp` and `$facebookClient`. :)


# Simple `GraphObject` example

`GET` request on `/me` endpoint. 

```php
$request = new FacebookRequest($facebookApp, '{access-token}', 'GET', '/me');
$graphObject = $facebookClient->sendRequest($request)->getGraphObject();
```

Graph will return:

```
{"id":"123","email":"me\u0040gmail.com","favorite_athletes":[{"id":"251061411860","name":"Spartan Race"}],"first_name":"Foo","gender":"male","languages":[{"id":"105673612800327","name":"German"},{"id":"110343528993409","name":"Spanish"},{"id":"106059522759137","name":"English"}],"last_name":"McBar"}
```

Autocasting using `getGraphObject()` will return:

```
object(Facebook\GraphNodes\GraphObject)
  protected 'items' =>
      'id' => string '123'
      'email' => string 'me@gmail.com'
      'favorite_athletes' => object(Facebook\GraphNodes\GraphObject)
      'first_name' => string 'Foo'
      'gender' => string 'male'
      'languages' => object(Facebook\GraphNodes\GraphObject)
      'last_name' => string 'McBar'
```

Notice how `favorite_athletes` and `languages` got auto-cast into `GraphObject`'s. The auto-casting is recursive so no matter how deep the data structure is, all the graph objects will be cast appropriately.


# GraphNode subclasses

You can cast a response into any of the GraphNode subclasses using the convenience methods. This is also great for your IDE since it will know exactly what kind of `GraphObject` subclass you are working with.

## Returning a `GraphUser` subclass

```php
$request = new FacebookRequest($facebookApp, '{access-token}', 'GET', '/me');
$graphUser = $facebookClient->sendRequest($request)->getGraphUser();
```

## Returning a `GraphAlbum` subclass

```php
$request = new FacebookRequest($facebookApp, '{access-token}', 'GET', '/{album-id}');
$graphAlbum = $facebookClient->sendRequest($request)->getGraphAlbum();
```

## Returning a `GraphPage` subclass

```php
$request = new FacebookRequest($facebookApp, '{access-token}', 'GET', '/{page-id}');
$graphPage = $facebookClient->sendRequest($request)->getGraphPage();
```

## Returning a custom subclass

You can write your own implementations of `GraphObject` subclasses and cast them.

```php
$graphFooObject = $facebookClient
	->sendRequest($request)
	->GraphObject('\\MyCustomGraphNode\\GraphFoo');
```


# `GraphList` example

If you're expecting a list of Graph objects, you can use the `getGraphList()` method.

```php
$request = new FacebookRequest($facebookApp, '{access-token}', 'GET', '/me/feed');
$graphFeedList = $facebookClient->sendRequest($request)->getGraphList();
```

> **TODO:** We still need to add pagination to the `GraphList` collection! :)


## Casting the items within a `GraphList`

If you're expecting all the Graph objects in a particular list to be of a certain type, you can cast them to that type by sending the subclass name as an argument.

```php
$graphUserList = $facebookClient->sendRequest($request)->getGraphList('GraphUser');

$graphFooList = $facebookClient
	->sendRequest($request)
	->getGraphList('\\MyCustomGraphNode\\GraphFoo', $auto_prefix = false);
```


# Smart-auto casting

The graph object subclasses can auto-detect and smartly cast certain subclass types using the `GraphObject::$graphObjectMap` array.

For example, in the `GraphUser` subclass, the `$graphObjectMap` looks like this:

```php
protected static $graphObjectMap = [
    'hometown' => 'Facebook\\GraphNodes\\GraphPage',
    'location' => 'Facebook\\GraphNodes\\GraphPage',
    'significant_other' => 'Facebook\\GraphNodes\\GraphUser',
  ];
```

This means the `hometown` field will get auto-cast into a `GraphPage` collection, the `location` field will get auto-cast into a `GraphPage` collection and the `significant_other` field will get auto-cast into a `GraphUser` collection.


# For-realz collections! Finally!

All the `GraphObject`'s & `GraphList`'s get returned as `Collection`'s. So we have tons of added flexibility working with the responses.

Let's grab a generic object:

```php
$graphObject = $facebookClient->sendRequest($request)->getGraphObject();
```

## Access directly as array

```php
echo $graphObject['name'];
```

You can also do this deeply into nested `GraphObject`'s:

```php
echo $graphObject['hometown']['name'];
```

## Iterate over results

```php
foreach ($graphObject as $k => $v ) {
	// . . .
}
```

## Count results

```php
echo count($graphObject);
```

## Convert to standard array

```php
$genericArray = $graphObject->asArray();
```

## Convert to JSON

```php
$json = $graphObject->asJson();
```

## Map over data (mutable)

```php
$graphObject->map(function ($value, $key) {
	// Do fancy changes to $value
	return $value;
});
```

# Auto-casting of `DateTime`

All date/time values will get converted to `DateTime` objects automatically. They will not get converted if a user has used the `date_format` modifier that returns a non-ISO-8601-formatted date.


# EOF

That's all! I hope that all makes sense! :)