[5.0] Casting Of Eloquent Attributes To Native Types

This was a feature I tried a while back, but this should be a better implementation.

Models can now have a `$casts` array of PHP native type casts that will be respected upon accessing attributes or exporting array/json. For example:

```php
protected $casts = [
    'username'   => 'string',
    'age'             => 'int',
    'settings'       => 'json'
];
```

Possibly casts are `int`, `integer`, `float`, `double`, `real`, `bool`, `boolean`, `string`, `json`.

Binary / Unset types were removed by request of @taylorotwell .

Feature request by @taylorotwell implemented:

Attributes with the `json` cast are stored within the model and database as a JSON string, however, setting and accessing / exporting these attributes will result in an `array` representing the JSON string. Useful for storing JSON in the database.

Tests provided.
This would probably be better as a single if statement.

```php
if ( ! array_key_exists($key, $attributes) || in_array($key, $mutatedAttributes))
{
    continue;
}
```