Merge pull request #387 from kpdecker/opt-attr-encoding

Optimize Attribute Encoding
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 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)