Remove routes.source_type / routes.source_id in favour of individual columns
Currently the `routes` table has these two columns: `source_type` and `source_id`. The `source_type` column can either be `Namespace`, or `Project`.
Because there are two columns this means you need to use both when filtering routes. For example:
```sql
SELECT *
FROM routes
WHERE source_type = 'Project'
AND source_id = 13083
```
Combining such a query with other conditions and JOINs can lead to less than ideal query plan. Another problem is that we're storing string values in `source_type`, with no limitation on the length. This means we're wasting both disk and index space.
We need to adjust the `routes` table so these two columns are replaced with the following columns:
* `namespace_id` for namespace routes
* `project_id` for project routes
This allows changing the above query to:
```sql
SELECT *
FROM routes
WHERE project_id = 13083
```
This also optimizes index and disk usage because we can now store integer values, instead of string values. Finally, this allows us to set up foreign keys. This ensures a route can not point to orphaned data, and routes are removed automatically when their source object is removed (if desired).
This does mean that we need to add 1 column per source type. This however is still _much_ better than the existing setup. Besides, it's unlikely we'll add many more over time (I don't see us using more than a handful of source types).
cc @dzaporozhets @smcgivern @rspeicher @DouweM
issue