Refactor, inject dependancies and defer

Should fix #47
Will only load when needed (because deferred)
Also, injected dependancies instead of using Facades
Throw exceptions instead of aborting.