Reland "Store metadata about updates in a file alongside with payload."

Relands CL: I3695b0903514eb6840e88810b8546fdca690819e

This original CL had an issue where we only generated metadata in the root
folder. This means updating twice using image_to_live with different images
would break updates.

I've fixed this in the second patch. Please compare P1 vs P2 as P1 is just
the re-landed version of I3695b0903514eb6840e88810b8546fdca690819e. I've
also fixed a bunch of pylint warnings that are now required per upload.

BUG=chromium-os:36990
TEST=Unittests on all changed code, pylint on all changed files, ran update
on x86-generic image using both the serve_only and generate latest workflows.
Ran autoupdate_EndToEndTest

Change-Id: I6bb65b23a34f071e388a4e522fb0fb42eae8781b
Reviewed-on: https://gerrit.chromium.org/gerrit/42271
Tested-by: Chris Sosa <sosa@chromium.org>
Reviewed-by: Gilad Arnold <garnold@chromium.org>
Commit-Queue: Chris Sosa <sosa@chromium.org>
diff --git a/log_util.py b/log_util.py
index 8b608a9..241fcfa 100644
--- a/log_util.py
+++ b/log_util.py
@@ -13,13 +13,13 @@
   """Provides a log method, with automatic log tag generation."""
   _CAMELCASE_RE = re.compile('(?<=.)([A-Z])')
 
-  def _Log(self, message, *args, **kwargs):
+  def _Log(self, message, *args):
     return LogWithTag(
         self._CAMELCASE_RE.sub(r'_\1', self.__class__.__name__).upper(),
-        message, *args, **kwargs)
+        message, *args)
 
 
-def LogWithTag(tag, message, *args, **kwargs):
-  # CherryPy log doesn't seem to take any optional args, so we'll just join
-  # them into a single string, if any are provided.
-  return cherrypy.log(message + ((' ' + ' '.join(args)) if args else ''), tag)
+def LogWithTag(tag, message, *args):
+  # CherryPy log doesn't seem to take any optional args, so we just handle
+  # args by formatting them into message.
+  return cherrypy.log(message % args, context=tag)