Add nodepool request framework

This does not actually talk to nodepool, but this adds the nodepool
request flow to the pipeline managers, and establishes a nodepool
class for zuul to interact with nodepool directly.

Change-Id: I41c4d8f86e140786d590698f1a0048c0011382dd
diff --git a/zuul/configloader.py b/zuul/configloader.py
index f551267..2748c94 100644
--- a/zuul/configloader.py
+++ b/zuul/configloader.py
@@ -53,6 +53,10 @@
                  'logserver-prefix': str,
                  }
 
+        node = {vs.Required('name'): str,
+                vs.Required('image'): str,
+                }
+
         job = {vs.Required('name'): str,
                'parent': str,
                'queue-name': str,
@@ -67,6 +71,7 @@
                'files': to_list(str),
                'swift': to_list(swift),
                'irrelevant-files': to_list(str),
+               'nodes': [node],
                'timeout': int,
                '_project_source': str,  # used internally
                '_project_name': str,  # used internally
@@ -494,7 +499,7 @@
             # Note: this is an ordered list -- we wait for cat jobs to
             # complete in the order they were launched which is the
             # same order they were defined in the main config file.
-            # This is important for correct inheritence.
+            # This is important for correct inheritance.
             TenantParser.log.debug("Waiting for cat job %s" % (job,))
             job.wait()
             for fn in ['zuul.yaml', '.zuul.yaml']: