Document : make this an abstract class (interface) with a factory that constructs a _DocumentProxy

This is the first step in architectural changes to make all the core
classes abstract, with
proxy-based implementations and vm-based pure Dart implementations.  The
factory constructors will give out only instances of the proxy-based
classes for the foreseeable future, but this gives us room to start
hacking on vm-based implementations in the background