Analyzing Dynamic Code: A Sound Abstract Interpreter for Evil Eval