My guess is they only remove captured pieces on the moved-to square (maybe relying on an implicit capture by overwriting an array entry). This is probably easier than actually tracking pieces that get captured.
It's super weird to say that we need rvalue references. rvalues with their odd semantics are only needed so that they don't break compatibility with the current reference/temporary rules. Instead passing object by move should be built into the language - each class should be moveable by default with proper support in the language
This is a bummer. The unwrap()'ing function already returned a result and should have just propagated the error. Presumably the caller could have handled more sensibly than just panic'ing.