Optimize add and remove class cases

Test: attributes - Add Remove class (file: jquery.html)
  cheerio x 1,953 ops/sec ±1.70% (94 runs sampled)
  old x 718 ops/sec ±2.92% (88 runs sampled)
  jsdom x 55.61 ops/sec ±1.16% (74 runs sampled)
Add single element benchmark case
Add test for removeAttr+attr on boolean attributes

Conflicts:
	test/api.attributes.js
Remove unnecessary encoding step for attrs

Test: attributes - Attributes (file: jquery.html)
  cheerio x 7,999 ops/sec ±4.13% (72 runs sampled)
  old x 4,423 ops/sec ±1.05% (98 runs sampled)
  jsdom x 65.22 ops/sec ±5.70% (69 runs sampled)

Test: attributes - Single Attribute (file: jquery.html)
  cheerio x 838,986 ops/sec ±5.47% (71 runs sampled)
  old x 328,370 ops/sec ±3.00% (90 runs sampled)
  jsdom x 11,593 ops/sec ±3.69% (88 runs sampled)

Test: attributes - Data (file: jquery.html)
  cheerio x 188,847 ops/sec ±3.71% (79 runs sampled)
  old x 6,894 ops/sec ±3.14% (89 runs sampled)
  jsdom x 3,963 ops/sec ±2.68% (89 runs sampled)
Remove unnecessary check from removeAttr
Add html rendering bench case
Simplify attribute rendering step

Removes the keyscan used to determine the size of the object.

Test: manipulation - html (file: jquery.html)
  cheerio x 9,709 ops/sec ±5.94% (76 runs sampled)
  old x 8,992 ops/sec ±8.62% (74 runs sampled)
  jsdom x 41.48 ops/sec ±9.33% (56 runs sampled)
  Fastest: cheerio

Test: manipulation - html render (file: jquery.html)
  cheerio x 103 ops/sec ±10.82% (62 runs sampled)
  old x 87.58 ops/sec ±11.02% (62 runs sampled)
  jsdom x 44.88 ops/sec ±13.67% (52 runs sampled)
  Fastest: cheerio
Cache tag check in render
Use string concat rather than [] join

Node's current v8 version is able to perform multiple string concat faster than the older array join.

Test: manipulation - html render (file: jquery.html)
  cheerio x 240 ops/sec ±2.33% (83 runs sampled)
  old x 144 ops/sec ±4.30% (79 runs sampled)
  jsdom x 56.46 ops/sec ±4.27% (62 runs sampled)

Conflicts:
	lib/render.js
Add independent html benchmark

Covers parser and rendering from initial html content.
Avoid delete operations

This helps us avoid a backing class change and any associated deoptimizations that may occur.
Cache rendered HTML on element objects

Test: manipulation - html render (file: jquery.html)
  cheerio x 814,945 ops/sec ±3.04% (84 runs sampled)
  old x 208 ops/sec ±3.97% (79 runs sampled)
  jsdom x 51.31 ops/sec ±4.01% (56 runs sampled)

Test: manipulation - html independent (file: jquery.html)
  cheerio x 8,974 ops/sec ±5.33% (79 runs sampled)
  old x 8,787 ops/sec ±4.41% (85 runs sampled)
  jsdom x 252 ops/sec ±6.28% (70 runs sampled)
Merge branch 'opt-attr-encoding'
Merge branch 'opt-render'

Conflicts:
	lib/render.js
Merge branch 'opt-cache-html'

Conflicts:
	lib/api/attributes.js
	lib/parse.js
	test/api.attributes.js