Proposed new API

Resolves #1
Resolves #11

With lots of help from @natefaubion.

@garyb What do you think of this? It breaks the API, but I think it offers some nice benefits.

Summary:

- Quite a few breaking changes to both names and types.
- A type for errors instead of using string concatenation.
- Breaking a few things out into their own submodules.
- Adding types and instances to handle null-like values.