== 1. Copy constructor: new object, own list, final fields intact ==
  rex  = Dog(Rex, [sit, roll]) bark=7
  rex2 = Dog(Rex, [sit, roll]) bark=7
  rex2.tricks == rex.tricks : false

== 2. The static type picks the constructor, so a subtype is sliced off ==
  new Animal(pet) = Animal(Rex, [sit, roll])

== 3. A virtual copy() keeps the runtime type ==
  pet.copy()      = Dog(Rex, [sit, roll]) bark=7
