feat(NodeAttrs): Implement forEach to iterate over attributes
refactor(core_dom/directive): Remove duplicated code
perf(NodeAttrs): Remove one unnecessary call to snakecase

The `_observers` map is now indexed by camelCase names, saving 1 call to
`snakeCase`. `this[attributeName]` was also resulting in calling
`snakecase` on an already snake-name (which is not an error).
feat(NodeAttrs): implement the keys getter and containsKey()