Every container in libc++ has a set of routines for handling propagate_on_container_swap, propagate_on_container_move_assignment and propagate_on_container_copy_assignment. They're all basically identical.
Make generic versions of these routines in <memory>, and demonstrate their use in vector::swap.
Along the way, update the noexcept() conditions on vector::swap
Eventually, propagate this pattern across all the containers.
Do we need these _NOEXCEPT decorators at all? I don't see where they are used or visible to the user.