Support structured logging and lazy pulling for backends.

* Wrap contents of log function in a try / catch so that the
  logger does not crash.

* Create a LogData module that extracts relevant information
  from log data and converts it into message strings.

* In LogData, support structured logging, so that it can process
  an arbitrary number of arguments, each of which can have an
  arbitrary number / variety of fields.

* In LogData, allow backends to customize their messages by
  exposing functions that generate specific messages, such as
  stack() and location(). Also create a default fullMsg()
  function with a stack, location, and message.

Change-Id: I11aa47bf5ec460be35011a63b78cffe886bbfd28
Merge "Support structured logging and lazy pulling for backends."