include compiled js
bundle js code with esbuild

Source files are moved to `src/pytaku/js-src/`,
while minified js bundle will go to `src/pytaku/static/js/`.
mobile-friendly buttons in chapter/title routes
deal with longer usernames

I'll probably need to lay down username rules soon...
somewhat ok navbar

Doesn't cope well with long usernames though.
somewhere pleasant "follows" grid
more reasonable cache defaults
CDN was a dud

Bunnycdn kept routing me to US/EU edges for some reason (although they
do have a Singapore edge), so things were slooooow. Since I don't have
access to a better CDN, let's not use one at all. Therefore, there need
to be more web workers to serve static stuff.

I should really look into async servers huh.
preload 2 pages at a time
try preloading a list instead of single imgs

For some reason the preloaded images didn't get reused when user
actually visited next chapter. Maybe this helps?
cache chapter data; preload next chapter's pages
decrease default number of gunicorn workers

Should be fine now, what with the filesystem cache and CDN.
I'd probably still need some sort of preload mechanism though.
allow custom hostname for proxied urls

Even with the filesystem cache, serving proxied images through the web
worker is still suboptimal.

This prefix allows me to optionally point all proxied urls to a CDN's
hostname instead. I'm using BunnyCDN, for example.

I'd prefer to solve this on the caddy server side instead, but
apparently caddy server doesn't support the `file server that falls back
to reverse proxy if file not found` use case.

Of course everything should still work out of the box without any CDN by
show source site error to user

New `@handle_source_site_errors` decorator that supports either html or
json responses.

- If html: just render a plain page
- If json: count on frontend code to report error appropriately.
  Currently it just `alert()`s the thing.
  Need to figure out a better UX.
concurrent & crash-proof search

I still dislike the catch-all though, so gotta fix that once I've sorted
out user-facing error reporting.

Also increased mangasee search cache lifespan.
protect scheduler against exceptions

A failed worker is now put back into the queue, for a maximum of 3
retries before its current turn is skipped.

Also, in the update title worker: just skip title if source site is
currently acting up.
don't test in build script for now

Let's turn it back on once I've figured out http caching for tests
add ripgrep ignore file
cache proxied images to filesystem, prune daily
drop unique chapter num_major/minor constraint

Because mangadex can have the same chapter uploaded by different groups.