util-core: Return Some from Buf unapply methods that return Some
util-core: Return Some from Buf unapply methods that return Some

Problem

Custom `unapply` methods returning `Option` cause Scala to skip exhaustivity
checking in pattern matching.

Solution

Modify the return types from `unapply` methods in com.twitter.io.Buf to return
`Some` when the method is statically known to return `Some`.

Result

1) Pattern matches containing the affected `unapply` methods will be checked
for exhaustivity. E.g.

    val buf: com.twitter.io.Buf = ???
    val opt: Option[String] = ???

    (buf, opt) match {
      case (Buf.Utf8(str), Some(otherStr)) => str + otherStr
    }

will now fail exhaustivity checking.

2) Code that was checking the `None` case from these `unapply` methods will now
warn about unreachable code:

    val buf: com.twitter.io.Buf = ???

    buf match {
      case Buf.Utf8(str) => str
      case _ => ""
    }

Differential Revision: https://phabricator.twitter.biz/D229218

twitter/util,twitter/util,twitter/util