[EPIC] Create new socketio package based on @tsed/schema
### Is your feature request related to a problem? Please describe.

`@tsed/socketio` use own metadata storage. It's a problem because we cannot share the code to create SocketService with a Rest Controller.

### Describe the solution you'd like

As is explained this discussion around Async API #1952, the new package should be able to generate the Async API Documentation. 

The goal is to be able to declare both a Rest controller and a Websocket controller as follows:

```ts
class PetCategory {
  @Required()
  @Groups("!partial", "!create", "!update")
  id: string;

  @Required()
  @Example("doggie")
  name: string;
}

enum PetStatus {
  AVAILABLE = "available",
  PENDING = "pending",
  SOLD = "sold"
}

class Pet {
  @Required()
  @Groups("!partial", "!create", "!update")
  id: string;

  @Required()
  @Example("doggie")
  name: string;

  @Property()
  category: PetCategory;

  @CollectionOf(String)
  tags: string[];

  @Enum(PetStatus)
  status: PetStatus;
}

@Controller("/")
@Name("PetStore")
class PetController {
  @Use("/")
  middleware(@PathParams("id") id: string) {}

  @Get("/:id")
  @Publish("pet.get")
  @Subscribe("pet.get")
  @Returns(200, Pet).Description("Returns a pet")
  @Returns(404)
  get(@PathParams("id") id: string) {
    return null;
  }

  @Get("/")
  @Publish("pet.getAll")
  @Subscribe("pet.getAll")
  @Returns(200, Array).Of(Pet).Description("Returns all pets")
  getAll() {
    return [];
  }

  @Patch("/:id")
  @Publish("pet.patch")
  @Subscribe("pet.updated")
  @Returns(200, Pet).Description("Returns a pet")
  @Returns(404)
  @Description("Patch a pet")
  patch(@PathParams("id") id: string, @BodyParams() @Partial() partial: Pet) {
    return null;
  }

  @Post("/:id")
  @Publish("pet.update")
  @Subscribe("pet.created")
  @Returns(200, Pet).Description("Returns a pet")
  @Returns(404)
  @Description("Update a pet")
  post(@BodyParams() @Groups("update") pet: Pet) {
    return null;
  }

  @Put("/")
  @Publish("pet.create")
  @Subscribe("pet.updated")
  @Returns(201, Pet)
  @Returns(404)
  @Description("Create a pet")
  put(@BodyParams() @Groups("create") pet: Pet) {
    return null;
  }

  @Delete("/:id")
  @Publish("pet.delete")
  @Subscribe("pet.deleted")
  @Returns(204)
  @Returns(404)
  @Description("Delete a pet")
  delete(@PathParams("id") id: string) {
    return null;
  }
}
```

### Tasks

 - [x] Implement `@Subscribe` and `@Publish` decorator on `@tsed/schema` package (PR: #186 )
 - [x] Implement mappers to generate Async API from `getSpec` function (`@tsed/schema) (PR: #186)
 - [x] Update `@tsed/platform-routers` to filter `SUBSCRIBE` and `PUBLISH` verbs.
 - [ ] Update `@tsed/platform-routers` to be reused to generate layers for socket platform.
 - [ ] Create a `@tsed/socketio-v2` package and add private tags on this package.
 - [ ] Create a `@tsed/async-api-ui` package to generate doc and serve the Async API UI
 - [ ] Use `@tsed/platform-routers` to map WS Layers
 - [ ] Deprecate the `@tsed/socketio` package
 - [ ] Update documentation

### Acceptance criteria

- [ ] The new package use `@tsed/schema`
- [ ] The new package support `@tsed/json-mapper` 
- [ ] The new package support middlewares
- [ ] The new package support the `Context`
- [ ] The new package can generate the Async API Documentation 