Refactor with more projects

Will use the abstract factory approach to allow for customisation of the
types of concrete objects used by the core library.  Refactor also means
that the core library knows nothing about extension scripts like Lua.