Allow to retain and release Serializable<Proxy>

There are two main changes :

- `Proxy` now implements `Serializable<Proxy>` : this allows to change the type of the parameter of `retain` and `release` from `Proxy` to `Serializable<Proxy>` without breaking change or duplicated methods to handle either `Serializable<Proxy>` or `Proxy`.
- change the return type of `retain` from `Proxy` to `dynamic`. I was initially returning `Serializable<Proxy>` but it was not backward compatible because one could have code like the following and a warning would have been displayed on `proxy.someMethod()`. With `dynamic` no warning should appear.

```dart
final proxy = js.retain(new js.Proxy(js.context.Foo));
proxy.someMethod();
```

I made several implementations of that feature - a14n/js-interop@9c67b9c32ad7f04ab5d7de7c2d17df8bb5cc3fe3 a14n/js-interop@af2b0621d0bac19fcc31b9a87e38e18b3bef17aa a14n/js-interop@ee2c582a2785d3a1319f6a4a694e781e56fcab6f a14n/js-interop@a19184a6aebfc077efdfe3614251e71c2bf6388e - but this PR uses the last one that I find the most fine.