Inconsistent properties of the Response class

**Summary.**
A couple of members of the Response class like status_code, encoding, history, reason, cookies are public attributes while text is a property.

The inconsistency is that text is a property, which means by default, it is just a getter(which should be the intended behavior) but end users can set values to status_code and other such attributes since it is a public member of the Response class and would allow setting values.

**## Expected Result**

These members should be immutable

`import requests                                                                                 

In [2]: response = requests.get('https://www.google.com')                                               

In [3]: response.status_code                                                                            
Out[3]: 200

In [4]: response.headers                                                                                
Out[4]: {'Date': 'Fri, 23 Aug 2019 18:54:26 GMT', 'Expires': '-1', 'Cache-Control': 'private, max-age=0', 'Content-Type': 'text/html; charset=ISO-8859-1', 'P3P': 'CP="This is not a P3P policy! See g.co/p3phelp for more info."', 'Content-Encoding': 'gzip', 'Server': 'gws', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'Set-Cookie': '1P_JAR=2019-08-23-18; expires=Sun, 22-Sep-2019 18:54:26 GMT; path=/; domain=.google.com, NID=188=hbFKD-1Uk27aRwtbI8lFqFNsvMhOGHkCuXy7_rl2pogI2-hR_sV6vV0jgeS4UokUn22ZLFRTaiwZszzo8bPZrdbAYa_jRTFHese7S5YkC8tYU6ltDNyz-zsMk8asR2zmq6kIH2o7Dt8aaKmskx4Ln4D7fJw3Gk0FGMXjW5EKWxg; expires=Sat, 22-Feb-2020 18:54:26 GMT; path=/; domain=.google.com; HttpOnly', 'Alt-Svc': 'quic=":443"; ma=2592000; v="46,43,39"', 'Transfer-Encoding': 'chunked'}

In [5]: response.headers = {}  # Should have raised AttributeError "Can't set attribute"                                                                         

In [6]: response.headers                                                                                
Out[6]: {}
`

**## Actual Result**

response.headers got set to {}

**## Reproduction Steps**

```python
import requests

response = requests.get('https://www.google.com')
print(response.status_code)
response.status_code = 69
response.status_code = 666

print(response.status_code)
```

**## System Information**

    $ python -m requests.help

```
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.8"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.7.4"
  },
  "platform": {
    "release": "4.15.0-58-generic",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.21.0"
  },
  "system_ssl": {
    "version": "1010100f"
  },
  "urllib3": {
    "version": "1.24.1"
  },
  "using_pyopenssl": false
}

```

This command is only available on Requests v2.16.4 and greater. Otherwise,
please provide some basic information about your system (Python version,
operating system, &c).


I tried converting attributes to properties but setters would be required for different components to set the corresponding values to these properties, which would make them mutable again.

One hacky solution would be to create a container class, whose object is returned without setters and the corresponding public attributes converted to private, with getter-only property wrappers once the response object has been built.