Button component

Fixes #29