Simplify and fix complicated and error prone `move`

Issues fixed:
* `move` is over-complicated
* `move` doesn't work with qualified structs
* `move` doesn't work with const/immutable non-struct types
* for a nested struct, `move` tries to call destructor on possibly invalid struct filled by `init` except with a context pointer of `target` (such mix is unexpected and invalid e.g. if default constructor is disabled)
* `move` fails do the correct mix of `init` and context pointer of `target` in previous point in some cases
* lots of other issues I'm to tired to search in list here
Fix and improve `move` documentation
Incorporate performance optimization suggested by @blackwhale