Introduce top-level DojoComponent abstraction