Improve error handling in webapp /keys

While investigating some problems with key loading, it was very
difficult to discern what exactly went wrong while requesting keys. One
important note is that if a project does not exist, the source drivers
just add it, which leads to 500 crashes later because those empty
projects don't have the public_key attribute.

Change-Id: Ic2eb0372620798dd7ca63e9e8205c39bd4629a92
diff --git a/zuul/webapp.py b/zuul/webapp.py
index acbaf0b..b5fdc0e 100644
--- a/zuul/webapp.py
+++ b/zuul/webapp.py
@@ -108,15 +108,17 @@
     def _handle_keys(self, request, path):
         m = re.match('/keys/(.*?)/(.*?).pub', path)
         if not m:
-            raise webob.exc.HTTPNotFound()
+            raise webob.exc.HTTPBadRequest()
         source_name = m.group(1)
         project_name = m.group(2)
         source = self.scheduler.connections.getSource(source_name)
         if not source:
-            raise webob.exc.HTTPNotFound()
+            raise webob.exc.HTTPNotFound(
+                detail="Cannot locate a source named %s" % source_name)
         project = source.getProject(project_name)
-        if not project:
-            raise webob.exc.HTTPNotFound()
+        if not project or not hasattr(project, 'public_key'):
+            raise webob.exc.HTTPNotFound(
+                detail="Cannot locate a project named %s" % project_name)
 
         pem_public_key = encryption.serialize_rsa_public_key(
             project.public_key)