Created separate subclasses for output and off-screen surfaces

There are a few exclusive operations for each type. Also we no longer
need the freeWhenDone flag since the class now determines whether the
surface should be freed or not.
Removed most uses of naked Surface pointers

However, SurfaceCollection remains a very important user.