component/markdown: add reusable Markdown.render