support for non-copyable structs

This change breaks the main non-assignable assign case:
```
struct Foo
{
    FooImpl * pimpl;
    this(int i)
    {
         pimpl = new FooImpl;
    }

    this(this)
    {
         duplictate(pimpl);
    }

   ~this()
    {
         GC.free(pimpl);
    }
}
AssociativeArray!(int, const(Foo)) aa;
aa[1] = Foo(1);
aa[1] = Foo(2); //rebinding of non-assignable objects.
```
This case is supported by the existing AA, thus we should support it too, I think.
This PR should affect only to structs with `@disable this(this)` and `@disable void opAssign(NC)`.