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.

the immediate issue is more that it was already like that ;-) and we're about to replace play-json with pickling anyhow. I don't mind if we eventually list the missing fields or something, but I don't think we should have anything very fancy.