pub fn build(tabs: &[Tab]) -> String
serialise tabs. invalid legs are skipped, at most 8 tabs, and tail tabs are dropped until the whole thing fits the 400-char cap (so it parses intact).