added custom exceptions
initial commit with passing tests