Command Interface

This isn't ready for merge yet, PRing for code review/comments.
if we have a `Request` object, maybe could return a `Response` object too.