[4.1] Native file upload support

This PR adds proper file upload support to 4.1.

There were a number of issues with how file uploads were handled.

1. The stream wrapper implementation always assumed data was being sent using `application/x-www-form-urlencoded` so properly encoding and sending files as `multipart/form-data` was impossible.
2. The only way to send a file was with the cURL implementation using `CURLFile`.
3. The default timeout was way too low for bigger files like videos or bigger images that took longer than 60 seconds to upload.
4. Videos could not be uploaded since videos have to be POSTed to the `graph-video.facebook.com` endpoint.
5. Batch requests did not support file uploads.
6. Starting a message with the `@` sign assumed you were uploading a file with the default cURL implementation. (See #250)

This PR fixes all of the above. :) And I also upgraded the Guzzle implementation to the latest 5.x version, so you'll need to `composer update` before running the tests.

PS: I tried to squash my commits, but since I was originally branching this from a branch that hadn't yet been merged into master, apparently that breaks git flow. So squashing doesn't seem to work properly. :/