Log formatter

Fixes #3

Let me know anyway I can improve! I still feel like I'm learning 'the functional way' so any feedback is appreciated.


`chardata()` creation should not use `Enum.map/2`. `map` is a `reduce` and a `reverse`, it is more efficient to just do a `reduce` using nested lists.

`chardata()` creation should not use `Enum.join/2` because `join` is creating one binary from a list of binaries. This involves appending all binaries to a single binary, which means alot of copying.  Instead add the space (or any joiner) as part of a `reduce` without appending to any binaries.

Something like this:
```elixir
defp output(:metadata, _, _, _, []), do: []
defp output(:metadata, _, _, _, [{key1, val1} | meta]) do
  first = [to_string(key1), ?= | to_string(val1)]
  Enum.reduce(meta, first, fn({key,val}, acc) -> [acc, ?\s, to_string(key), ?= | to_string(val)] end)
end
```
Notice I put a binary in the tail each time, which creates an `improper_list`, this saves us a couple of words of memory over creating a proper `list`.