Simplify watch/ValueChanged/BuildValue

* make BuildValue, TaskResult, ValueChanged into simple JsValue holders so we don't need the type parameter complexity
* we can thus drop `DynamicSerialization` and associated complexity from client side
* we then make `SbtClient.watch[T]` require a static Reads for the watched type so we have compile-time safety that we can deserialize
* if the server-provided value doesn't match the T we wanted to watch, we get a failure result passed to the watch listener
* we keep `SbtClient.rawWatch()` for now because it allows you to get a custom exception type. We can probably do better here, like a `watchWithCustomException[T,E]`.
* ValueChanged, TaskResult, and BuildValue could probably all be collapsed together or at least one of the three eliminated, but haven't done that in this patch; this would also lead to replacing rawWatch with some nicer approach probably.

I presume the use of `asOpt` here is motivated by:

from: https://groups.google.com/d/msg/sbt-dev/7IpZrq79oz0/JSgVlSOb9RsJ
> * in the public interface, do NOT have explicit access to 
> implementation of either JSON or binary parsers/writers, or any AST, 
> or any kind of validation with human-readable errors 

If so, I'm not sure I agree with this idea.  Since the `Reads[T]` is only in scope on the client side, someone may have written a `Reads[T]` that at some point in time worked (perhaps as a way to get a value out of a plugin's return value) but no longer does.  It would be helpful to the developer to know what failed as opposed to a `None`