WIP: refactor again, start to pull out the Result datatype, but it's not fully abstract yet
Done: hide the constructor for Result.  It's abstract.