Add json

Closes #2025
In the event that someone is calling prepare with all of its arguments and no keyword arguments, won't this suddenly change their params argument to now be the json argument?

Eg

```
request.prepare('get', '/foo', {}, {}, {}, {'foo': 'bar'}, {'auth': 'pass'})
```

Everything gets shifted by one.