First cut of user CLI API 

These should all use `@functools.wraps(func)` to make sure the proper names + docstrings get carried over.