OptionReads should validate JSON value if it exists

Currently OptionReads delegates to format.reads without checking if the value exists and ignores the error returned by the format.

Say I have:
`case class User(name: Option[String])`

Then `{ "name": "Drew" }` is a valid JSON, so is `{ }`, but `{ "name": 12 }` is not. Currently, OptionReads will return JsSuccess(None) when reading `{ "name": 12 }` instead of an error. This PR fixes that.
I think we want to map JSON `null` to `None`, so this should be

```scala
  case JsUndefined() | JsNull => JsSuccess(None)
```