defcomponent: add docstring, support optional opts