Add: Generic Router Interface

Renamed Router to NaiveRouter and introduced Router as
an interface so I can introduce multiple types of
router to suit different situations
Merge branch 'feature/router-interface' into develop

* feature/router-interface:
  Add: Generic Router Interface
Add: SerializableRouter

Created new router that can be serialized/cached or dispatch
multiple routes if required.
Merge branch 'feature/cacheable-router' into develop

* feature/cacheable-router:
  Add: SerializableRouter
Add: Changelog
Merge branch 'release/0.4'

* release/0.4:
  Add: Changelog
  Add: SerializableRouter
  Add: Generic Router Interface