Better support for overloading start and destroy methods in Session

Move functionality from static start and destroy functions into instance
methods, allowing these to be overloaded. This works the same way as
calling Session::set() which then in turn calls inst_set()

Additionally use Injector to create the default Session instance to
allow the class to be swapped out.
I know I'm nitpicking on code from previous iterations, but wouldn't it be more readable and less error prone if there were an early out here:

    if(headers_sent()) {
        return;
    }

    if(!session_id()) {
        ....