Refactor get_classes for readability

Investigation following a mailing list thread
(https://groups.google.com/d/msgid/django-oscar/a1489359-cfa6-44dc-90d8-2958be9e88a1%40googlegroups.com)
highlighted that an overriding app can't be a root app, e.g. overriding
'oscar.dashboard' with an app called 'dashboard' did not work.

In the past, there's been a lot of subtle issues surrounding the
get_classes code. Hence, some effort was expended to make the logic more
readable and fix the issue. Docstrings have been expanded, comments have
been written and private methods have been renamed.