Change ShadowBoundary to ignore duplicate styles

Style elements are inserted at a shadow boundary. This means the style elements of a transcluding component will be inserted at the top of the closest shadow dom component. 

This PR changes ShadowBoundary to remember what style elements have already been inserted. This means that a shadow-dom component that has hundreds of transcluding components (e.g., a table) will have only one style element instead of hundreds.

Depends on #1315
abstract class must not be `@Injectable`