Use bowser for mobile detection

# Problem
Mobile detection previously just looked at if touch events were supported. This can get us into problems with touch enabled desktops and laptops.

# Solution
Use the bowser library which does a much more reliable job of detection
:eyes: Sneaky