Allow passing a default json encoder/decoder for all requests

## Summary
Add a method onto `requests` so a default json decoder and encoder can be given when calling `json.dumps` and `json.loads()`

## Details
Unlike #4097, what I ask here is a way of setting such encoder and decoder which is used in all requests and not just only on an individual one. The basic idea is the same except this is meant to be a global setting and not a by-request setting.
In my application's situation, it would mean saving many lines of code and it would also mean more abstraction. 
Such option would allow having this setup in a dependency where the rest of the application knowing a new class have had a way of being encoded/decoded.

Would a global setting be justifiable? Or same stance?

We don't presently provide any configuration of the `json=` parameter. It's rather simply just `.dumps`

https://github.com/requests/requests/blob/b66908e7b647689793e299edc111bf9910e93ad3/requests/models.py#L458

We also don't do any creation of a decoder in the `json` method on a Response

https://github.com/requests/requests/blob/b66908e7b647689793e299edc111bf9910e93ad3/requests/models.py#L868

So I'm not entirely certain that I'm in favor of this idea. I'm also not entirely against it though. I don't think it's unreasonable, but I'm also conflicted because in my mind, the *right* way would be to have two attributes: 1 for decoding and for 1 encoding. That gets to be a messy and confusing API in all likelihood though.

This also poses a problem with the ability to pickle a session. Since we try to allow for that, we'd need these objects to be pickleable and I'm unfamiliar with how friendly they behave with pickle.

This is a possible example, to show the idea:

**My code:**
main.py:

	class BasePlusDateEncoder(json.JSONEncoder):
			def default(self, o):
				if isinstance(o, datetime.datetime):
					return o.isoformat()

				return super().default(o)
				
	if __name__ == '__main__':
		requests.jsonEncoder(BasePlusDateEncoder)

	
backend_requests.py:

	requests.post("http://api.world/people",
		json=personal_data
	)

**Your code:**
__init__.py:

	_json_encoder = None
	
	def jsonEncoder(new_encoder=None, force_replace=False):
		# Do checks, if necessary
		_json_encoder = new_encoder


requests/requests/models.py:
	
	def prepare_body(self, data, files, json=None):
		#[...]
		body = complexjson.dumps(json, cls=__init__._json_encoder)

From my checks, such solution is picklable (according to: https://docs.python.org/2.4/lib/node66.html)

Did I miss anything?

> Did I miss anything?

No, I assumed you were talking about a Session object having its own encoder and decoder. In fact, it seems you were asking for a module global configuration setting. That will never happen. There's no prior art for that, and it's a painful thing for maintainers to have to deal with. You might register one encoder, import a library, and that library will override your setting. That will result in an unending flood of bug reports

> (according to: https://docs.python.org/2.4/lib/node66.html)

Those docs are for Python 2.4. We do not support 2.4.

OK. Makes sense. Thank you.