Named augmentations

This PR adds a new syntax for augmentations allowing them to have a name, and thus to be reused in the module scope to augment classes or structs.
This can be seen as a kind of lightweight traits.

As an example:
```golo
module NamedAugmentations

augmentation testNamedAugmentation = {
  function foo = |this| -> "foo"
  function bar = |this, a| -> this: length() + a
}

augmentation otherNamedAugmentation = {
  function spam = |this| -> "spam"
}

augment java.lang.String with testNamedAugmentation, otherNamedAugmentation

augment java.lang.String {
  function baz = |this| -> "baz"
}
```

```golo
module TestNamedAugmentations

import NamedAugmentations

function main = |args| {
  let mystring = "hello"
  require(mystring: foo() == "foo", "foo failed")
  require(mystring: bar(4) == 9, "bar failed")
  require(mystring: spam() == "spam", "spam failed")
  require(mystring: baz() == "baz", "baz failed")
}
```

works just fine, but
```golo
module SomeOtherModule

import NamedAugmentations

augment SomeObject with testNamedAugmentation
```
will generate an error.

Code duplication for `augmentations` and `augmentationApplications`