The Calculational Design of a Generic Abstract Interpreter