move stuff around and cleanup
update how params are passed to constructor
return nil, error for recovable errors
spec for errors