Redesigned how backreferences are handled

Due to a few edge cases (which had failing tests!), the previous
approach could not be made to work.
Now, the result of all backreference groups is stored in its own class,
which inherits from string (rather than just a plain old string), in
order to keep track of the group_id
Fixed group-within-group backreference bug

CaptureGroupResult needed to store an ARRAY of all group IDs it
contains.
For example, /((foo))/ only contains ONE CaptureGroupResult, but this
needs to have group IDs of 1 AND 2 in order for backreferences to work
properly.