Convert problem specification to an array

Rather than having separate class, type and subtype attributes, the
problem type now has a specification array that is allocatable so can be
an arbitrary length to provide more flexibility when specifying
problems.