parse nested types; qualified, array and tuple type

tuple:     (int, char), (), ...
array:     [int], [char], ...
qualified: maybe int, ...
compound:  maybe [(int, maybe char, [char], maybe (int, maybe char), string)]