Use `FieldTypeTuple!S` instead of `typeof(S.tupleof)` in `std.traits.hasElaborate{CopyConstructor,Assign,Destructor}`.
Use `__traits(compiles, ...)` instead of `is(typeof(...))` in `std.traits.hasElaborateAssign`.
Fix `std.traits.hasElaborateAssign` for static arrays.
Add lvalue/rvalue traits

* add `isLvalue`/`isImplicitlyConvertableToLvalue`
* add `rvalueOf`/`lvalueOf`
Use `std.traits.{rvalueOf,lvalueOf}` in `std.traits.hasElaborateAssign`.
Fix `std.traits.hasElaborate*` docs for static arrays.
Document compiler-generated `opAssign` for `std.traits.hasElaborateAssign`.

* also add unittests