> If someone uses the `setAttr` method, the value is encoded and stored, whereas cheerio.load doesn't HTML encode attribute values (that in itself is a bit of an inconsistency, but I didn't want to touch that since that's a spec change that might affect a bunch of people).

We need to fix this inconsistency before doing anything else. It's impossible to do the right thing in all cases without knowing whether the input is text or HTML. The `-> decode -> encode ->` approach is unsound:

```javascript
> var utils = require('./lib/utils')
undefined
> var text = 'When writing HTML, use "&amp;" rather than "&".'
undefined
> utils.decode(text)
'When writing HTML, use "&" rather than "&".'
> utils.encode(utils.decode(text))
'When writing HTML, use &quot;&amp;&quot; rather than &quot;&amp;&quot;.'
```

Attribute values should be stored unencoded in cheerio objects, and encoded on the fly if and when an element's HTML is requested.