[FEAT] Support AdditionalProperties with model
## Information

### Is your feature request related to a problem? Please describe

Actually, Ts.ED doesn't support an additionalProperties with a custom json-schema described here:

https://json-schema.org/understanding-json-schema/reference/object.html#additional-properties

```jsonc
{
  "type": "object",
  "properties": {
    "number": { "type": "number" },
    "street_name": { "type": "string" },
    "street_type": { "enum": ["Street", "Avenue", "Boulevard"] }
  },
  "additionalProperties": { "type": "string" } // here
}
```

#### Supported scenarios
##### AdditionalPorperties: true

```typescript
import {AdditionalProperties, Property} from "@tsed/schema";

@AdditionalProperties(true)
class Model {
  @Property()
  id: string;

  [key: string]: any;
}
```

In this case, the validator accept extra properties and the extra properties will be added to the instance mapped by json-schema.

**JsonSchema**
```json
{
  "additionalProperties": true,
  "properties": {
      "id": {
         "type": "string"
       }
    },
   "type": "object"
}
```

#### AdditionalPorperties: false

```typescript
import {AdditionalProperties, Property} from "@tsed/schema";

@AdditionalProperties(false)
class Model {
  @Property()
  id: string;
}
```

The validator will throw an error or ignore extra properties depending on the server options.
Extra properties won't be mapped to the instance object.

### Feature request

`AdditionalProperties` decorator must accept a JsonSchema, type or a class model as first parameters.

### Simple usecase

```typescript
import {AdditionalProperties, Property} from "@tsed/schema";

@AdditionalProperties({type: "string")
class Model {
  @Property()
  id: string;

  [key: string]: string;
}
```

or

```typescript
import {AdditionalProperties, Property} from "@tsed/schema";

@AdditionalProperties(String)
class Model {
  @Property()
  id: string;

  [key: string]: string;
}
```

or

```typescript
import {AdditionalProperties, Property, string} from "@tsed/schema";

@AdditionalProperties(string())
class Model {
  @Property()
  id: string;

  [key: string]: string;
}
```

Expected:

```json
{
  "additionalProperties": {
     "type": "string"
   },
  "properties": {
      "id": {
         "type": "string"
       }
    },
   "type": "object"
}
```

### Using model

```typescript
import {AdditionalProperties, Property} from "@tsed/schema";

class NestedModel {
 @Property()
  label: string;
}

@AdditionalProperties(NestedModel)
class Model {
  @Property()
  id: string;

  [key: string]: NestedModel;
}
```

Expected:

```json
{
  "additionalProperties": {
     "type": "object",
     "properties": {
       "label": {
         "type": "string"
       }
     }
   },
  "properties": {
      "id": {
         "type": "string"
       }
    },
   "type": "object"
}
```

## Acceptance criteria

- [ ] AdditionalProperties accept a class, type or json schema
- [ ] The generated json-schema is valid
- [ ] The plain object javascript is correctly mapped to a class (and his nested class)
