Refactor companion apply reader into arbitrary value reader

This should make it straightforward to fall back to a constructor if there is no companion object apply method.
Add class constructor reading support to arbitrary type reader