Accurately parse User Agent strings using simple, cascading rules