Add groovy step support

In the process, refactor BasicSteps to be composed rather than inherited from.