Update Logger

Gives us better messages by automatically printing the calling thread
name, file and line number it was called from. This is relatively
expensive, and should not be enabled for production builds.
It's lazier in production, and we'll do less work if logging is suppressed. 
Instead of having clients format their own strings, it can now format it for them.
This lets us allocate fewer String objects. 
Exceptions are also formatted by us, so we can be lazy about it and retrieve the stack trace only when debugging is enabled.

```
Logger.d(hello + "," + world + "!");
// Allocates 5 string objects,
// even if logging is disabled

Logger.d("%s, %s!", hello, world);
// Allocates only three when logging is disabled