Generic either (coproduct) data type