refactor runners into struct; refactor out common output dir function; add test runner