Refactor Target.java and add tons of tests

Make Target an interface implemented by SrvTarget and ExplicitTarget.
This allows us to not collapse multiple master endpoints into one
target, which will enable better CLI output later on.

E.g. `helios jobs --master master1 --master master2 --json` outputs

```
{
  master1: {A},
  master2: {B}
}
```

instead of

```
{
  A+B
}
```
Looking through the code some more, perhaps this is why `Target` was a class instead of an interface, so callers wouldn't have to deal with generic wildcards. If dealing with wildcards feels too ugly, maybe it's worth keeping `Target` as an abstract class with factory methods?