anchor.diff:  
   == How do I extend it?
   
  -Easy, open up a Python class like this and implement the only two necessary
  -functions.
  +Easy, open up a Python class like this and implement the following:
   
   [source,python]
   ----
  -class MyContentProvider(BaseContentProvider):
  -    def add_input(self, input):
  +class MyAsset(BaseAsset):
  +    def list_output(self):
           pass
  -    def _install(self, source):
  +    def install(self, filename):
  +        pass
  +    def validate(self, input_obj):
           pass
   ----
   
  -Better yet, inherit from +StaticContentProvider+ to get an +add_input+
  +Better yet, inherit from +StaticAsset+ to get a +list_output+
   implementation that handles file and directory inputs (a directory input is
  -equivalent to adding it's contents recursively.)
  +equivalent to adding it's contents recursively.) and a +validate+
  +implementation that asserts the input is a pathname pointing to an existing
  +file.
   
   [source,python]
   ----
  -class MyContentProvider(StaticContentProvier):
  -    def _install(self, source):
  -      # Source can be any arbitrary object instance.
  +class MyStaticAsset(StaticContentProvier):
  +    def install(self, filename):
         pass
   ----
   
  
positive.code: plugin objects declared in the asset.json file. If no suitable plugin object
  is found, the user is informed that the asset was not installed.
  . +dist+
  * A pathname relative to the dist/ root where files will be installed,
  * It's generally expected that files will maintain their containing folder
  structure relative to their source directory when copied over their dist root.
  This is how StaticContentProvider works but obviously any plugin can install
  files however it chooses.
  . +input+
  * An array of arbitrary objects, each one will be sent to a plugin's
  +add_input+ function.
  
  The following attributes are optional:
  
  . +type_options+
  * Default: +{}+
  * Some arbitrary option, passed to the content provider.
  * This is for configuring the specific asset as a whole on-the-fly.
  
  ==== Plugin Objects
  
  A plugin object is required to have the following attributes:
  
  
negative.code:   [
      {
        "root":"assets/myfiles",
        "type":"myasset",
        "dist":"myfiles",
        "input":["."]
      }
  