Change the instant execution cache bean serialization so that it honors the `writeReplace()` contract for `Serializable` types. This allows a plugin to use the Guava collection types, which happen to use this contract for serialization. This could be viewed as a work around for the lack of support for multiple classes with the same name (and that is certainly the motivation). However, this provides a potential escape hatch for plugin authors to work around serialization issues. It also provides a nice migration path for re-using the bean serialization in other places, such as task properties, isolated work parameters and tooling models, all of which currently use Java Serialization as the general purpose contract.
Do not deserialize all `List` implementations from the instant execution cache as `ArrayList`, as a step towards support for plugins using Guava types. Also simplify the contract that codecs use to write values, making it symmetrical for writing and reading.