Initial commit.

I'll clean up/finish the unit tests later.