ComponentJS, second try

Follow-up from #738 

@rse I tried bringing some closer to our coding guidelines. It should give you an idea of what the source should look like. :)