Pull implementation details out of MessageSink.scala
WIP
Add word count example
Multiple samza job compilers

Living the dream here... `coast` now has a safe and a dangerous mode.

Not too pleased about some of the hacks going on, but I'm also not
interested in burning a bunch of time on it when I already plan to merge
things again later. Thankfully, I don't think it makes things that much
more confusing for the 'safe' case.
Change partitioning strategy

There are two use-cases for the partitioner I'm particularly interested
in:

- Locality-sensitive hashing: this puts 'similar' data in the same
  partition, which sometimes helps you avoid extra network traffic.
- Kafka's default partitioning: `coast` tries to play nicely with
  existing tools, so it's important that it can use the same
  partitioning strategies as Kafka out-of-the-box.

In theory, the last implementation could support either, depending on how
you interpreted the HashCode. The issue was that they didn't mix well --
if you had some old-school topics and some locality-sensitive, you'd
need to configure different 'interpretations' for different topics,
which is pretty error-prone. Instead of that mess, the partitioner now
makes all the decisions -- though that requires passing a little extra
data around.
Split up gargantuan `ops.scala` file

They're still tightly coupled, but now it's easier to find what you're
looking for.
Stop complaining about higher kinds

I don't like using higher kinds in Scala -- so when I do, there's a good
reason, and the compiler's whining doesn't help anyone.