Enable visitation to return a result
Add proper move constructor and assigment
Use nicer way of defining return type