Store performance for issue #358

+ Tasks are now stored as individual keys.
+ Apps using the old storage format will be migrated on their first read if found.
+ Marathon performs some cleanup of orphaned tasks once after a reboot.
+ Added comprehensive unit tests for the TaskTracker module and refactored code slightly.
Tested this:
1) Create an appdefinition
2) Stop marathon
3) remove the app definition from zookeeper
4) Start marathon

When reconcileAndScale is called, I got an exception (I named the app mongo).
java.util.NoSuchElementException: key not found: mongo
	at scala.collection.MapLike$class.default(MapLike.scala:228)
	at scala.collection.AbstractMap.default(Map.scala:58)
	at scala.collection.mutable.HashMap.apply(HashMap.scala:64)
	at mesosphere.marathon.tasks.TaskTracker$$anon$1.scala$collection$mutable$SynchronizedMap$$super$apply(TaskTracker.scala:30)
	at scala.collection.mutable.SynchronizedMap$class.apply(SynchronizedMap.scala:48)
	at mesosphere.marathon.tasks.TaskTracker$$anon$1.apply(TaskTracker.scala:30)
	at mesosphere.marathon.tasks.TaskTracker.shutDown(TaskTracker.scala:113)
	at mesosphere.marathon.MarathonScheduler$$anonfun$reconcileAndScaleTasks$2$$anonfun$apply$8.apply(MarathonScheduler.scala:299)
	at mesosphere.marathon.MarathonScheduler$$anonfun$reconcileAndScaleTasks$2$$anonfun$apply$8.apply(MarathonScheduler.scala:293)
	at scala.collection.immutable.Set$Set1.foreach(Set.scala:74)
	at mesosphere.marathon.MarathonScheduler$$anonfun$reconcileAndScaleTasks$2.apply(MarathonScheduler.scala:293)
	at mesosphere.marathon.MarathonScheduler$$anonfun$reconcileAndScaleTasks$2.apply(MarathonScheduler.scala:281)
	at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:695)