Rewrite `data` internals with caching behavior

Defer the storage and type coercion of HTML5 `data-*` attributes until a
read operation. At this time, cache the value of the data attribute so
that the DOM is not referenced again, as per the jQuery implementation:

> The data- attributes are pulled in the first time the data property is
> accessed and then are no longer accessed or mutated (all data values
> are then stored internally in jQuery). [1]

[1] http://api.jquery.com/data/
Merge pull request #474 from jugglinmike/data-as-cache

Rewrite `data` internals with caching behavior