add the notion of a source and all the plumbing that comes with it; add error returns to some methods that were calling exit(1) from outside main.go making it hard to test