Adaptive and Effective Fuzzing: a Data-Driven Approach