Introduce BeyondSupervisor.

BeyondSupervisor is our new root actor which supervises all actors that are
created by Beyond. For now, it has two children: LauncherSupervisor and
UserActionActor.
Make ZooKeeperLauncher use PinnedDispatcher.

ZooKeeperLauncher needs a dedicated thread because it synchronously waits for
server startup and shutdown.
Check if ZooKeeper server is healthy by sending a heartbeat message.

If ZooKeeper server does not respond within 30 seconds, ZooKeeperLauncher
throws a ServerNotResponding exception. Then, LauncherSupervisor restarts
ZooKeeperLauncher.
Use Thread.join() to wait for ZooKeeperThread termination.
Remove ZooKeeperThread.

ZooKeeperThread introduces a level of indirection with little additional value.
Use plain Thread instead.
Exclude slf4j-log4j12 dependency.

SLF4J binds only one underlying framework at a time. Currently, we have two
bindings: logback-classic and slf4j-log4j12. Exclude slf4j-log4j12 dependency
so that we have only one binding.

This patch removes the following log:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/kseo/tools/play-2.2.2/repository/local/ch.qos.logback/logback-classic/1.0.13/jars/logback-classic.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/kseo/tools/play-2.2.2/framework/../repository/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

The following link explains how to exclude transitive dependencies:
http://www.scala-sbt.org/0.13.1/docs/Detailed-Topics/Library-Management.html#automatic-dependency-management
Log ZooKeeper startup and shutdown.
Add logback configuration file for customization.

This is the default configuration file used by Play:
http://www.playframework.com/documentation/2.2.x/SettingsLogger
Make Akka use Slf4jLogger for logging.

The default logging system of Play is also Slf4jLogger. Use the same logging
system in Akka for the ease of management.
Show Akka config settings on startup.

This is helpful when diagnosing a Akka related problem.
Add scala-logging to SBT library dependencies.

SLF4J-backed implementation will be used for logging.
https://github.com/typesafehub/scala-logging
Read MongoDB database path from application.conf.

beyond.mongodb.dbpath key is used.
Throw LauncherInitializationException if no mongod binary is found.

This will stop MongoDBLauncher actor.
Log MongoDB startup and shutdown.
Set SingleConsumerOnlyUnboundedMailbox as default Akka mailbox.

SingleConsumerOnlyUnboundedMailbox is more efficient than the default mailbox,
UnboundedMailbox backed by java.util.concurrent.ConcurrentLinkedQueue. It is
okay to use SingleConsumerOnlyUnboundedMailbox because we don't use a
BalancingDispatcher.

See "Default Mailbox" section of
http://doc.akka.io/docs/akka/2.2.1/scala/mailboxes.html
Set the log level of Beyond to INFO.
Change the supervision strategy of UserActionActor router.

Routers default to a strategy of "always escalate". This is problematic because
a failure in a routee is escalated up to the router's supervisor for handling.
If the router's supervisor decides to restart the child, (which is the default,
unfortunately), the router and all of its routees are restarted.

So override the router's strategy with SupervisorStrategy.defaultStrategy which
restarts only the failing child actor upon Exception.

See Routers and Supervision section of
http://doc.akka.io/docs/akka/2.2.1/scala/routing.html for further discussions.
Use ## instead of hashCode().

We should always use ## instead of hashCode() because subclasses of AnyVal do
not behave properly from a hashing perspective.

See http://stackoverflow.com/questions/9068154/what-is-the-difference-between-and-hashcode
for further explanation.
Read ZooKeeper config path from application.conf.

beyond.zookeeper.config-path key is used.
Use Akka's dispatcher when sending the result of UserAction.

We need an execution context here to schedule sending the result of UserAction.
There is no reason to use a separate execution context for this small task.
Just use Akka's execution context.