code: public CoroutineRunner read(byte[] data) {
          if (data == null) {
              throw new NullPointerException();
          }
  
          SerializedState serializedState = deserializer.deserialize(data);
          return reconstruct(serializedState);
      }
docs: Deserializes a {@link CoroutineRunner} object from a byte array.
  <p>
  If you're handling your own deserialization and you simply want to reconstruct the deserialized object to the
  {@link CoroutineRunner}, use {@link #reconstruct(com.offbynull.coroutines.user.SerializedState) }.
  @param data byte array to deserialize
  @return {@code data} deserialized to a {@link CoroutineRunner} object
  @throws NullPointerException if any argument is {@code null}
  @throws IllegalArgumentException if failed to deserialize or deserialized to a state for an unrecognized method (e.g. a method that's
  state is being deserialized for was changed but no {@link FrameUpdatePoint} was provided to this class's constructor to
  handle the changes)