Bug 44970: Parse HTML fragments inside a body, and use Util.parseHTML everywhere

Fragments starting with comments, link and meta tags were parsed incorrectly.
Comments ended up outside the implicit HTML element. Link and meta tags ended
up in the header.

This patch replaces direct uses of the HTML5 parser with Util.parseHTML and
wraps fragments into a body tag to avoid the issue above. It also returns the
document node from parseHTML, and makes sure that document.body is defined.

Also, use HTML.serialize wrapped into Util.serializeNode for full-page API
serialization output. This adaptively uses single quotes for (most) JSON
attributes, which cuts down on &quot; bloat.

Vs. current master (676fee70a4), the uncompressed size of the Barack Obama
article drops from 1722113 to 1475269 bytes. Compressed size drops slightly
from 263 to 257kb.

No change in parserTests.

Change-Id: I9b402c190e2782fba98a557181bc51245bcbd674