OCSADV-27: Model and parser for VoTable

Model, Parser and tests for VoTable xml. The main public function takes an xml node and returns a list of resources containing sidereal targets. Likely, there will be changes to the model as it is integrated into the AGS and UI

As much as possible the parser tries to retain parsing errors, but at the same will extract as many valid targets as possible
Yeah you want to sequence your `List[CatalogProblem \/ Magnitude]` which will give you a `CatalogProblem \/ List[Magnitude]` which is what you want here I think (first left or all the rights). Sorry about the `separate` confusion; I couldn't see what you were trying to do. Just say

```scala
  magnitudes <- mags.map(parseMagnitude).toList.sequenceU
```

and I think it will do what you want.