make a bunch of breaking changes, add some tests, move functions, etc