Rewind readable body before POST redirect

This addresses the issue (#3079) of Requests hanging when a POST with a file-like body encounters a temporary redirect. This currently has the unmerged tests from #3536, so I'll need to remove those if we reach a point where we're ready to merge this.

This approach has a couple of things that I'm not especially happy with but couldn't come up with a nicer alternative. I've added a few outstanding questions below.

1.) I feel like `body_position` should probably be `_body_position`, but we need to use it in the `Session` module. Making it a private var would require an additional getter method for `PreparedRequest` to expose the data to `Session`, but I wanted to run that by before adding more  code. It just seems problematic to provide any encouragement to manually set `body_position` since it will lead to fairly unintuitive behaviour.

2.) As I noted in the comment [here](https://github.com/nateprewitt/requests/commit/b84d71461e238b123a39ce91a48a99e3eb03717c#commitcomment-19619276), this still allows for the possibility that a request with a file-like object, that has tell but no seek, to hang. I feel like we should raise an `IOError` if we can't rewind, at least allowing the user to manually recreate the body and POST it to the new URL. Does that seem reasonable?


Alright @Lukasa, I think everything in that last round should be addressed. A couple of notes on some decisions I made in these tweaks.

Python 2.7 decided it needs to return a long from `tell` instead of an int like every other version. I've adjusted for that by casting it to int because we can't test for long in Py3.

I didn't declare the "sentinel object" as a global because I couldn't come up with a scenario where it was equivocal to anything in the sessions module. Simply setting it to object accomplishes what we were looking for but perhaps there's a caveat I'm missing here?

~~**Tests.** I went a little crazy. I have a few "lifecycle" tests, but found a snag when adding `test_rewind_body_failed_tell`. I realized things were failing in different ways (`_body_position` was never being set with the custom test objects) but the error messages produced were still "correct". In order to prevent accidental regressions, I add specific tests for setting `_body_position` and failure conditions in `rewind_body` by manually setting `_body_position`. Let me know if you want these collapsed back.~~

Edit: I went ahead and expanded the test objects to simplify the testing.


Here's another round of changes @Lukasa.

I moved the `rewind_body` to a util function but when I started looking at moving tests over to `test_utils` they're going to bring a lot of import overhead with them. I can chop them up into individual `_body_position` and `rewind_body` tests and divide them up accordingly. Otherwise, we can leave them where they are.


Alright, ValueError removed, tuple properly instantiated, and comment added. I also squashed most of the commits down. There's an unnecessary space I need to pull from beneath the `_body_position` declaration but I'll do that when I remove bc199e7 before merging. That is unless we have another round :)


Want to do your final tidying up now, @nateprewitt? I don't think I'm going to have any further feedback at this time.


Ok, I think things are good to go from my end.


Just a reminder, we'll need to merge #3536 before this is merged.


Ah, sorry, I didn't realise that's what was going on there. Can you merge the branch from #3536 into this branch and then I'll merge them both as one? I'd rather not have a weird interim master state where we have deliberately failing tests on the master branch.


Ok, everything is merged in and this should be ready to go. It will now supersede #3536.


Thanks for this @nateprewitt!