Use (END - $$) and I think you'll find that it works (in the same section - in multiple sections you may have to calculate sizes of the sections seperately and add 'em up).
"scalar" is found only in the error messages - you won't find it in the manual. It means that a label like "END" is a relocatable value - its value isn't known until link-time. Since Nasm does its own "linking" with "-f bin", it *could* theoretically be figured out, but would require some special-case code. It probably isn't the value you want, anyway. Assuming "org 100h" for a .com file, "END" is going to evaluate to 123h or so - not the size of your code, which is what you want to divide by 16. The difference between two labels is "scalar", a single label is not. I've been known to use labels "aaa:" and "zzz:" to "clearly" indicate beginning and end of code. ("$$" just means "beginning of section", but may be a little cryptic and unreadable).
The "phase error" is a bonus error message. :) You're *supposed* to see it if Nasm can't resolve all symbols in the number of passes you specify with the "-O" switch, but it crops up if almost anything goes wrong. Ignore it, unless it's the *only* error message, in which case increase the parameter to "-O" (I like "-O999").
In real mode, interrupts (like the timer interrupt) use *your* stack. I'm not sure what we can expect for maximum stack usage... 0x12 might be a little light. (unless you need every last byte, resizing to 64k and leaving the stack alone is easy)
I'm not sure what the extra 4 paragraphs you allocate are for... "/16" or ">>4" truncate, so you might want to add 1... but that might be a "waste"... (zzz - aaa + 15)/16 should get it right. Plus any extra you need...
(Do you know that the US Post Office considers "batchelor's degree" to be sexist language, and won't let employees use it?)
Best,
Frank